99偷拍视频精品区一区二,口述久久久久久久久久久久,国产精品夫妇激情啪发布,成人永久免费网站在线观看,国产精品高清免费在线,青青草在线观看视频观看,久久久久久国产一区,天天婷婷久久18禁,日韩动漫av在线播放直播

LINQ查詢表達式如何利用c#進行構建-創新互聯

這篇文章將為大家詳細講解有關LINQ查詢表達式如何利用c# 進行構建,文章內容質量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關知識有一定的了解。

目前成都創新互聯已為成百上千家的企業提供了網站建設、域名、網絡空間、網站托管維護、企業網站設計、穆棱網站維護等服務,公司將堅持客戶導向、應用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協力一起成長,共同發展。

最近工作中遇到一個這樣的需求:在某個列表查詢功能中,可以選擇某個數字列(如商品單價、當天銷售額、當月銷售額等),再選擇小于或等于大于或等于 ,再填寫一個待比較的數值,對數據進行查詢過濾。

如果只有一兩個這樣的數字列,那么使用 Entity Framework Core 可以這么寫 LINQ 查詢:

public Task<List<Product>> GetProductsAsync(string propertyToFilter, MathOperator mathOperator, decimal value)
{
  var query = _context.Products.AsNoTracking();

  query = propertyToFilter switch
  {
    "Amount1" when mathOperator == MathOperator.LessThanOrEqual => query.Where(x => x.Amount1 <= value),
    "Amount1" when mathOperator == MathOperator.GreaterThanOrEqual => query.Where(x => x.Amount1 >= value),

    "Amount2" when mathOperator == MathOperator.LessThanOrEqual => query.Where(x => x.Amount2 <= value),
    "Amount2" when mathOperator == MathOperator.GreaterThanOrEqual => query.Where(x => x.Amount2 >= value),

    _ => throw new ArgumentException($"不支持 {propertyToFilter} 列作為數字列查詢", nameof(propertyToFilter))
  };

  return query.ToListAsync();
}

如果固定只有一兩個數字列且將來也不會再擴展,這樣寫簡單粗暴,也沒什么問題。

但如果有幾十個數字列,這樣使用 swith 模式匹配的寫法就太恐怖了,代碼大量重復。很自然地,我們得想辦法根據屬性名動態創建 Where 方法的參數。它的參數類型是:Expression<Func<T, bool>>,是一個表達式參數。

要知道如何動態創建一個類似 Expression<Func<T, bool>> 類型的表達式實例,就要知道如何拆解表達式樹。

對于本示例,以 x => x.Amount1 <= value 表達式實例為例,它的表達式樹是這樣的:

LINQ查詢表達式如何利用c# 進行構建

然后我們可以按照此表達式樹結構來構建我們的 LINQ 表達式:

public Task<List<Product>> GetProductsAsyncV2(string propertyToFilter, MathOperator mathOperator, decimal value)
{
  var query = _context.Products.AsNoTracking();

  var paramExp = Expression.Parameter(typeof(Product));
  var memberExp = Expression.PropertyOrField(paramExp, propertyToFilter);
  var valueExp = Expression.Constant(value);
  var compareExp = mathOperator == MathOperator.LessThanOrEqual ?
    Expression.LessThanOrEqual(memberExp, valueExp) :
    Expression.GreaterThanOrEqual(memberExp, valueExp);
  var lambda = Expression.Lambda<Func<Product, bool>>(compareExp, paramExp);

  return query.Where(lambda).ToListAsync();
}

每個 Expression.XXX 靜態方法返回的都是一個以 Expression 為基類的實例,代表一個表達式。不同的表達式又可以組成一個新的表達式,直到得到我們需要的 Lambda 表達式。這樣就形成了一種樹形結構,我們稱為表達式樹。知道如何把一個最終的查詢表達式拆解成表達式樹,我們就容易動態構建此查詢表達式。

得到一個表達式后,我們還可以動態編譯并調用該表達式,比如上面示例得到的 lambda 變量,是一個Expression<Func<Product, bool>> 類型,調用其 Compile 方法,可以得到 Func<Product, bool> 類型的委托。

...

var toTestProduct = new Product { Amount1 = 100, Amount2 = 200 };

Func<Product, bool> func = lambda.Compile();
var result = func(toTestProduct);

Console.WriteLine($"The product's {propertyToFilter} is to {mathOperator} {value}.");

// Output: The product's Amount1 is LessThanOrEqual to 150.

關于LINQ查詢表達式如何利用c# 進行構建就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

網站名稱:LINQ查詢表達式如何利用c#進行構建-創新互聯
轉載源于:http://www.yijiale78.com/article34/ddcipe.html

成都網站建設公司_創新互聯,為您提供網頁設計公司做網站、外貿建站響應式網站、外貿網站建設定制開發

廣告

聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯

微信小程序開發