内射老阿姨1区2区3区4区_久久精品人人做人人爽电影蜜月_久久国产精品亚洲77777_99精品又大又爽又粗少妇毛片

LINQ查詢表達(dá)式如何利用c#進(jìn)行構(gòu)建-創(chuàng)新互聯(lián)

這篇文章將為大家詳細(xì)講解有關(guān)LINQ查詢表達(dá)式如何利用c# 進(jìn)行構(gòu)建,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個(gè)參考,希望大家閱讀完這篇文章后對(duì)相關(guān)知識(shí)有一定的了解。

目前成都創(chuàng)新互聯(lián)已為成百上千家的企業(yè)提供了網(wǎng)站建設(shè)、域名、網(wǎng)絡(luò)空間、網(wǎng)站托管維護(hù)、企業(yè)網(wǎng)站設(shè)計(jì)、穆棱網(wǎng)站維護(hù)等服務(wù),公司將堅(jiān)持客戶導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長(zhǎng),共同發(fā)展。

最近工作中遇到一個(gè)這樣的需求:在某個(gè)列表查詢功能中,可以選擇某個(gè)數(shù)字列(如商品單價(jià)、當(dāng)天銷(xiāo)售額、當(dāng)月銷(xiāo)售額等),再選擇小于或等于大于或等于 ,再填寫(xiě)一個(gè)待比較的數(shù)值,對(duì)數(shù)據(jù)進(jìn)行查詢過(guò)濾。

如果只有一兩個(gè)這樣的數(shù)字列,那么使用 Entity Framework Core 可以這么寫(xiě) 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} 列作為數(shù)字列查詢", nameof(propertyToFilter))
  };

  return query.ToListAsync();
}

如果固定只有一兩個(gè)數(shù)字列且將來(lái)也不會(huì)再擴(kuò)展,這樣寫(xiě)簡(jiǎn)單粗暴,也沒(méi)什么問(wèn)題。

但如果有幾十個(gè)數(shù)字列,這樣使用 swith 模式匹配的寫(xiě)法就太恐怖了,代碼大量重復(fù)。很自然地,我們得想辦法根據(jù)屬性名動(dòng)態(tài)創(chuàng)建 Where 方法的參數(shù)。它的參數(shù)類(lèi)型是:Expression<Func<T, bool>>,是一個(gè)表達(dá)式參數(shù)。

要知道如何動(dòng)態(tài)創(chuàng)建一個(gè)類(lèi)似 Expression<Func<T, bool>> 類(lèi)型的表達(dá)式實(shí)例,就要知道如何拆解表達(dá)式樹(shù)。

對(duì)于本示例,以 x => x.Amount1 <= value 表達(dá)式實(shí)例為例,它的表達(dá)式樹(shù)是這樣的:

LINQ查詢表達(dá)式如何利用c# 進(jìn)行構(gòu)建

然后我們可以按照此表達(dá)式樹(shù)結(jié)構(gòu)來(lái)構(gòu)建我們的 LINQ 表達(dá)式:

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();
}

每個(gè) Expression.XXX 靜態(tài)方法返回的都是一個(gè)以 Expression 為基類(lèi)的實(shí)例,代表一個(gè)表達(dá)式。不同的表達(dá)式又可以組成一個(gè)新的表達(dá)式,直到得到我們需要的 Lambda 表達(dá)式。這樣就形成了一種樹(shù)形結(jié)構(gòu),我們稱(chēng)為表達(dá)式樹(shù)。知道如何把一個(gè)最終的查詢表達(dá)式拆解成表達(dá)式樹(shù),我們就容易動(dòng)態(tài)構(gòu)建此查詢表達(dá)式。

得到一個(gè)表達(dá)式后,我們還可以動(dòng)態(tài)編譯并調(diào)用該表達(dá)式,比如上面示例得到的 lambda 變量,是一個(gè)Expression<Func<Product, bool>> 類(lèi)型,調(diào)用其 Compile 方法,可以得到 Func<Product, bool> 類(lèi)型的委托。

...

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.

關(guān)于LINQ查詢表達(dá)式如何利用c# 進(jìn)行構(gòu)建就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到。

網(wǎng)站名稱(chēng):LINQ查詢表達(dá)式如何利用c#進(jìn)行構(gòu)建-創(chuàng)新互聯(lián)
轉(zhuǎn)載源于:http://www.rwnh.cn/article34/ddcipe.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)頁(yè)設(shè)計(jì)公司、做網(wǎng)站、外貿(mào)建站、響應(yīng)式網(wǎng)站、外貿(mào)網(wǎng)站建設(shè)定制開(kāi)發(fā)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

微信小程序開(kāi)發(fā)
鹤岗市| 孟州市| 青海省| 林芝县| 宁国市| 西青区| 仪陇县| 班戈县| 汝南县| 桑日县| 聊城市| 阿拉善左旗| 辽源市| 泌阳县| 五原县| 资溪县| 灵武市| 诸城市| 温泉县| 南靖县| 岳西县| 呼和浩特市| 牡丹江市| 界首市| 漾濞| 海安县| 安仁县| 河池市| 民权县| 龙南县| 舞钢市| 徐水县| 香港| 黔西县| 农安县| 桃园县| 乌恰县| 高邮市| 广南县| 杭州市| 贡觉县|