我有这个查询,当我想检查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.date
和Func<>
类型之间的关系是什么? p.date
会返回IEnumerable
的某些内容吗?
答案 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);