下面的代码:
var mids = _db.Members
.GroupBy(m => new { m.MemberID, m.CreatedDate })
.Where(m => m.All(s => s.Status == 1) && m.Key.CreatedDate.Date == DateTime.Today)
.Select(m=>m);
我收到运行时错误:LINQ to Entities不支持指定的类型成员'Date'。仅支持初始化程序,实体成员和实体导航属性
当我将_db.Members.AsEnumerable()添加到第一行时,它将起作用。
我的理解是.AsEnumerable()强制查询在客户端执行。因此,在上面的代码中,AsEnumerable运算符将查询分为两部分,在服务器端进行选择,并在客户端进行休息(group by,where)。
有人可以验证我的理解是否正确吗?为什么没有.AsEnumerable()的代码失败?
您的理解是正确的。调用AsEnumerable
数据源后,将无法再查询它,并退回到简单的“给我一切”模式,这意味着所有数据都将传输到客户端,并且任何进一步的操作都在本地完成。
这也是查询无法按书面方式工作的原因:为了使其正常工作,您在LINQ方法中使用的所有表达式都必须可以翻译为数据源可以理解的任何语言-并且因为它是查询提供者的翻译责任,无论您编程支持什么内容,都将使您受其束缚。
在这种特定情况下(假设为EF),可以通过手动替换规范函数的属性访问来将查询固定为可查询模式TruncateTime
:
.Where(m => m.All(s => s.Status == 1)
&& EntityFunctions.TruncateTime(m.Key.CreatedDate) ==
EntityFunctions.TruncateTime(CurrentDateTime()))
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句