ステータスに基づいて DB 内のレコードを合計するラムダ関数を抽象化したかったのです。問題は、生成されたラムダを LINQ to Entities に対して実行すると、"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
そして、ラムダジェネレーターを使用する方法の例を次に示します。
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
注: このエラーに関する他の質問を調べましたが、式の代わりにラムダ (Func) が使用されたため、間違った LINQ の使用に焦点を当てているようです。sum メソッドでは、すべての候補が Func を取るように見えるので、他に何を変更できるかわかりません。