![](/img/trans.png)
[英]LINQ error: System.NotSupportedException on GroupBy Selection
[英]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.date
和Func<>
類型之間是什么關系? 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) > 2
您Min(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.