簡體   English   中英

LINQ GroupBy子句System.NotSupportedException錯誤

[英]LINQ GroupBy Clause System.NotSupportedException error

我有這個查詢,當我想檢查Min()方法中的日期時遇到了這個錯誤。 誰能解釋原因? 我只是對Expression<Func>Func<>有所了解。

var s2 = md.Tb_order
    .GroupBy(x => x.orderid)
    .Where(x => x.Min(p => p.date > 2))
    .Select(x => x);

System.NotSupportedException:'類型為''的指定方法'布爾型Min [Tb_order,Boolean](System.Collections.Generic.IEnumerable 1[SqlServer_LinqTest.Tb_order], System.Func 2 [SqlServer_LinqTest.Tb_order,System.Boolean])'無法將System.Linq.Enumerable'轉換為LINQ to Entities存儲表達式,因為沒有重載與傳遞的參數匹配。'*

如果我在方法之外檢查日期,則可以正常工作

var s2 = md.Tb_order
    .GroupBy(x => x.orderid)
    .Where(x => x.Min(p => p.date) > 2)
    .Select(x => x);

已編輯

當我看到Where()方法的解釋時,似乎必須有一個Func<>的參數。 p.dateFunc<>類型之間是什么關系? p.date是否返回IEnumerable

根據 ,最小值是Min<TSource, TResult>

TSource源元素的類型。

TResult選擇器返回的值的類型(在這種情況下為最小日期)。

但您在此處傳遞的條件不是所期望的,而是期望值的序列確定其最小值。

回答您的問題p.date和Func <>類型之間是什么關系?

p.date是指向可枚舉x的屬性日期的指針,x是組字典的值,字典中組結果是<key,value> ,其中key是訂單ID,value是具有以下內容的訂單的列表相同的組鍵(訂單ID),因此在編寫Min(p => p.date)Min(p => p.date) linq獲取此序列的最小日期(值列表)。

因此,當您執行此Min(p => p.date) > 2Min(p => p.date) > 2最小值(從min的結果)與2進行比較,這很好,但是當您傳遞Min(p => p.date> 2)時您傳遞的是LINQ無法翻譯的內容,因為我們之前提到過,它期望值的序列而不是條件。

摘要

如果您使用正確的方法,則告訴linq根據訂單ID對所有訂單進行分組,然后排除組最小日期不超過2的組(排除整個組列表)。 也許這就是你想要的,

也許你想要這個。

var s2 = md.Tb_order
    .Where(x => x.date > 2)
    .GroupBy(x => x.orderid);

它將返回日期大於2的所有訂單,然后將它們分組。

這與第一個訂單不同,因為當第一個訂單不符合日期> 2時,第一個訂單將忽略所有屬於同一id的訂單,但是此訂單將僅忽略日期> 2的訂單。

誰能解釋原因?

Min()是一個聚合函數 您無法匯總方法-例如p.date > 2 但是,您可以聚合一個表達式-例如p.date

我假設你試圖找到秩序, 具有最小date是大於2。事實上, Min()方法可以找到最小的date ,但僅此而已。 它無法檢查其他條件。 為此,您應該將記錄限制為僅包含日期大於您感興趣的日期的訂單,然后進行匯總:

var s2 = md.Tb_order
    .Where(x => x.date > 2)
    .GroupBy(x => x.orderid)
    .Min(x => x.date);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM