1

ステータスに基づいて 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 を取るように見えるので、他に何を変更できるかわかりません。

4

2 に答える 2

1

Entity Framework クエリ プロバイダーは、関数を認識していませんAuditsWithStatus。EF は、linq ステートメントのすべてを sql に変換しようとします。EF は、同等の sql を認識している .Net 関数の制限されたセットのみを処理できます。残りの部分については、linq ステートメントのすべてが式 ( Expression<Func<...>>) でなければなりません。

つまり、関数を使用できますが、orを使用した後にのみ、関数を linq-to-objects に変換します。または、関数を式に変換する必要があります。ToList()ToArray()

于 2012-07-27T22:50:07.590 に答える
-1

匿名関数をチェックしてください。

.Sum は、C# で Func<bool> と呼ぶものを期待しています。あなたは1または0を返していますが、これは整数または倍精度の暗黙のいずれかです(どちらを忘れましたが、質問の文脈では重要ではありません。)

簡単に言うと、1 か 0 ではなく、真か偽かということです。

于 2012-07-27T18:10:20.487 に答える