亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

C# 使用字符串參數來定義對象列表中要過濾的屬性

C# 使用字符串參數來定義對象列表中要過濾的屬性

C#
幕布斯6054654 2023-09-16 15:07:03
我想使用 filterType 參數來定義 Stock 對象上要過濾的屬性。[HttpGet("{searchText}/{filterType}")] public async Task<ActionResult<List<Stock>>> Get(string searchText, string filterType) {    List<Stock> v = await this._context.StockView.Where(w => w.[filterType] == searchText).ToListAsync();    return this.Ok(v); }有沒有辦法做到這一點,我可以使用字符串參數來定義要限制的對象的屬性?
查看完整描述

2 回答

?
慕姐8265434

TA貢獻1813條經驗 獲得超2個贊

您可以使用表達式樹動態構建 Linq where 子句來過濾動態屬性。


我知道這可能需要消化很多東西,但是,就這樣吧。將 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);

 }

動態生成的 Linq 表達式應該可以毫無問題地轉換為 SQL。


查看完整回答
反對 回復 2023-09-16
?
12345678_0001

TA貢獻1802條經驗 獲得超5個贊

要做你想做的事情,你需要編寫一堆映射代碼。(超出范圍,你需要展示你已經嘗試過的內容)


這樣您就可以動態設置字段,執行原始 sql 會更容易。


或者,您可以設置數據來支持您的搜索...見下文。


[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);

 }


查看完整回答
反對 回復 2023-09-16
  • 2 回答
  • 0 關注
  • 173 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號