Linq 为什么用创建lambda的函数替换IQueryable.Sum选择器中的lambda会失败?(错误1025)
我想抽象一个lambda函数,它根据数据库中记录的状态对记录进行汇总。问题是,当我对LINQtoEntities运行生成的lambda时,会得到“Internal.NETFramework数据提供程序错误1025”(仅供参考,它对LINQtoObjects运行良好) 代码如下:Linq 为什么用创建lambda的函数替换IQueryable.Sum选择器中的lambda会失败?(错误1025),linq,lambda,linq-to-entities,Linq,Lambda,Linq To Entities,我想抽象一个lambda函数,它根据数据库中记录的状态对记录进行汇总。问题是,当我对LINQtoEntities运行生成的lambda时,会得到“Internal.NETFramework数据提供程序错误1025”(仅供参考,它对LINQtoObjects运行良好) 代码如下: <Extension()> _ Public Function Summarize(ByVal auditsToSummarize As IQueryable(Of HvacAudit)) A
<Extension()> _
Public Function Summarize(ByVal auditsToSummarize As IQueryable(Of HvacAudit)) As IQueryable(Of HvacAuditSummary)
Return From audit In auditsToSummarize
Group By month = audit.DateCreated.Value.Month Into g = Group
Select New HvacAuditSummary With {
.GroupingKey = month,
.Pending = g.Sum(Function(audit) If(audit.AuditStatusInt = CType(AuditStatus.Pending, Integer), 1, 0)),
.Issued = g.Sum(Function(audit) If(audit.AuditStatusInt = CType(AuditStatus.Issued, Integer), 1, 0)),
.Closed = g.Sum(Function(audit) If(audit.AuditStatusInt = CType(AuditStatus.Closed, Integer), 1, 0)),
.Cancelled = g.Sum(Function(audit) If(audit.AuditStatusInt = CType(AuditStatus.Cancelled, Integer), 1, 0))
}
End Function
注意:我已经查看了这个错误的其他问题,它们似乎都集中在使用错误的LINQ上,因为使用了lambda(Func)来代替表达式。在sum方法中,所有候选函数似乎都使用Func,因此我不知道还能更改什么。查看您的匿名函数 .Sum期望的是C#中我们称之为Func的东西。您返回的是1或0,它们是隐式的整数或双精度(我忘记了,但在您的问题上下文中并不重要)
长话短说-对或错,不是1或0 实体框架查询提供程序不知道您的函数
AuditsWithStatus
。EF尝试将linq语句中的所有内容转换为sql,并且它只能处理一组有限的.Net函数,它知道这些函数的sql等价物。对于其余部分,linq语句中的所有内容都必须是表达式(expression
)
这意味着:只能在使用
ToList()
或ToArray()
后才能使用函数,这会将函数转换为linq to对象。或者您必须将函数转换为表达式。如何将函数转换为表达式?请尝试或使用。我希望我可以对该注释进行双重表决。我见过的最清晰的表达介绍。谢谢。Sum需要一个Func,返回指定实体的要添加的值。请参阅此处的文档:
Select New HvacAuditSummary() With {
.Cancelled = g.Sum(AuditsWithStatus(AuditStatus.Cancelled))
}
Private Function AuditsWithStatus(auditStatus As AuditStatus) As Func(Of HvacAudit, Integer)
Return Function(audit) If(audit.AuditStatusInt = CType(auditStatus, Integer), 1, 0)
End Function