繁体   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