2 回答

TA貢獻(xiàn)1813條經(jīng)驗 獲得超2個贊
您可以使用表達(dá)式樹動態(tài)構(gòu)建 Linq where 子句來過濾動態(tài)屬性。
我知道這可能需要消化很多東西,但是,就這樣吧。將 StockItem 替換為 StockView DbSet 的類型
[HttpGet("{searchText}/{filterType}")]
public async Task<ActionResult<List<Stock>>> Get(string searchText, string filterType)
{
var queryableStockView = this._context.StockView;
// w =>
var param = Expression.Parameter(typeof(StockItem), "w");
var propertyInfo = typeof(StockItem).GetProperty(filterType);
if (propertyInfo == null)
throw new Exception($@"Property ""{property}"" was not found");
// w.[filterType]
var left = Expression.Property(param, propertyInfo);
// searchText
var right = Expression.Constant(searchText, typeof(string));
// w.[filterType] == searchText
var expression = Expression.Equal(left, right);
// Bring it all together
// Where(w => (w.[filterType] == searchText))
var whereExpression = Expression.Call(
typeof(Queryable),
nameof(System.Linq.Enumerable.Where),
new Type[] { queryableStockView.ElementType },
queryableStockView.Expression,
Expression.Lambda<Func<StockItem, bool>>(expression, new ParameterExpression[] { param })
);
// Run query against the database
var filteredItems = queryableStockView.Provider.CreateQuery<StockItem>(whereExpression);
var v = await filteredItems.ToListAsync();
return this.Ok(v);
}
動態(tài)生成的 Linq 表達(dá)式應(yīng)該可以毫無問題地轉(zhuǎn)換為 SQL。

TA貢獻(xiàn)1802條經(jīng)驗 獲得超5個贊
要做你想做的事情,你需要編寫一堆映射代碼。(超出范圍,你需要展示你已經(jīng)嘗試過的內(nèi)容)
這樣您就可以動態(tài)設(shè)置字段,執(zhí)行原始 sql 會更容易。
或者,您可以設(shè)置數(shù)據(jù)來支持您的搜索...見下文。
[HttpGet("{searchText}/{filterType}")]
public async Task<ActionResult<List<Stock>>> Get(string searchText, string filterType)
{
var v = await this._context.StockView
.Where(x => x.Type == filterType
&& x.SearchField == searchText).TolistAsync();
return this.Ok(v);
}
- 2 回答
- 0 關(guān)注
- 168 瀏覽
添加回答
舉報