LINQ GroupBy子句System.NotSupportedException错误

时间:2017-09-30 11:58:43

标签: c# entity-framework linq

我有这个查询,当我想检查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:&#39;指定的方法&#39; Boolean Min [Tb_order,Boolean](System.Collections.Generic.IEnumerable 1[SqlServer_LinqTest.Tb_order], System.Func 2 [SqlServer_LinqTest.Tb_order,System.Boolean])& #39;在类型System.Linq.Enumerable&#39;无法转换为LINQ to Entities存储表达式,因为没有重载与传递的参数匹配。&#39; *

如果我检查方法之外的日期,它可以正常工作

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

EDITED

当我看到Where()方法的解释时,似乎必须有Func<>的参数。 p.dateFunc<>类型之间的关系是什么? p.date会返回IEnumerable的某些内容吗?

2 个答案:

答案 0 :(得分:0)

根据this,Min是 Min<TSource, TResult>

<强> TSource 源元素的类型。

<强> TResult 选择器返回的值的类型(在本例中为最小日期)。

但是你传递的条件不是预期的,它期望一系列值来确定最小值。

回答你的问题 p.date和Func&lt;&gt;之间的关系是什么?类型?

p.date是指向可枚举x的属性日期的指针,它是组字典的值,字典中的组结果是<key,value>,其中key是订单ID,value是列表具有相同组密钥(订单ID)的订单,因此当您编写Min(p => p.date)时,您要求linq获取此序列的最小日期(值列表)。

所以当你这样做Min(p => p.date) > 2时,你将最小值(结果来自min)与2进行比较,这很好,但是当你通过Min(p =&gt; p.date&gt; 2)时你正在传递LINQ无法翻译的内容,因为我们之前提到它正在期待一系列值,而不是一个条件。

<强>摘要

如果您采取正确的方式,则告诉linq根据订单ID对所有订单进行分组,然后排除组最小日期不超过2的组(排除整个组列表)。 也许这就是你想要的,

或者你想要这个。

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

将返回日期大于2的所有订单,然后对它们进行分组。

这与第一个不同,因为第一个将忽略属于同一个id的所有订单,如果其中一个订单不符合日期&gt; 2,但这个只会忽略日期&gt; 2.

答案 1 :(得分:0)

  

有谁可以解释原因?

Min()aggregate function。你不能聚合一个方法 - 例如p.date > 2。然而,您可以在表达式上聚合 - 例如p.date

我假设您正在尝试查找订单, HAVING 大于2的最小date。确实,Min()方法可以找到最小值date,但就是这样。它无法检查其他条件。为此,您应该将记录限制为仅包含日期大于您感兴趣的任何日期的订单,然后进行汇总:

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