![](/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.