Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linq 为什么用创建lambda的函数替换IQueryable.Sum选择器中的lambda会失败?(错误1025)_Linq_Lambda_Linq To Entities - Fatal编程技术网

Linq 为什么用创建lambda的函数替换IQueryable.Sum选择器中的lambda会失败?(错误1025)

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

我想抽象一个lambda函数,它根据数据库中记录的状态对记录进行汇总。问题是,当我对LINQtoEntities运行生成的lambda时,会得到“Internal.NETFramework数据提供程序错误1025”(仅供参考,它对LINQtoObjects运行良好)

代码如下:

    <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