1

我想抽象出一个我拥有的 lambda 函数,它根据它们的状态总结我的数据库中的记录。问题是,当我针对 LINQ to Entities 运行生成的 lambda 时,我收到“Internal .NET Framework Data Provider error 1025”。(仅供参考,它适用于 LINQ to Objects)。

这是代码:

    <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

这是我如何尝试使用 lambda 生成器的示例:

    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

注意:我已经查看了有关此错误的其他问题,他们似乎都专注于使用错误的 LINQ,因为使用 lambda (Func) 代替表达式。在 sum 方法中,所有的候选人似乎都拿了一个 Func,所以我不知道我还能改变什么。

4

2 回答 2

1

实体框架查询提供程序不知道您的功能AuditsWithStatus。EF 尝试将您的 linq 语句中的所有内容转换为 sql,并且它只能处理一组受限的 .Net 函数,它知道这些函数的等效 sql。其余的 linq 语句中的所有内容都必须是表达式 ( Expression<Func<...>>)。

这意味着:您可以使用您的函数,但只能使用ToList()or之后使用ToArray(),这会将其转换为 linq-to-objects。或者你必须把你的函数变成一个表达式。

于 2012-07-27T22:50:07.590 回答
-1

查看您的匿名函数。

.Sum 期待在 C# 中我们称之为 Func<bool> 的内容。您返回 1 或 0,它们是整数或双精度数(我忘记了,但在您的问题的上下文中并不重要。)

长话短说 - 真或假,不是 1 或 0!

于 2012-07-27T18:10:20.487 回答