0

私は次のように書いたこのメソッドを持っています:

private void GetReceivedInvoiceTasks(User user, List<Task> tasks)
        {
            var taskList = from i in _db.Invoices
                           join a in user.Areas on i.AreaId equals a.AreaId
                           where i.Status == InvoiceStatuses.Received
                           select i;

        }

基本的に、私はデータベース内のユーザーの領域にある、ステータスが受信済みのすべての請求書を取得しようとしていました。現在、LINQをよく理解していません。

エラーが発生しました:

base {System.SystemException} ={"タイプ'Models.Area'の定数値を作成できません。このコンテキストでは、プリミティブタイプ(' Int32、String、Guid'など)のみがサポートされます。"}

誰かが私が間違っていることとこれを修正する方法を私に説明できますか?私は現在、問題が何であるかを理解できません。行を削除しても問題ありませんが、ユーザーのエリアからの請求書のみを確実に受け取るために、そのjoin行が本当に必要です(複数のエリアに属することができます)。このクエリで根本的に何か問題がありますか?

4

1 に答える 1

4

Entity Frameworkは、メモリ内コレクションとの結合をサポートしていません。Contains代わりにプリミティブのコレクションを使用してクエリを使用するには、クエリを再配線する必要があります。

また、EFは現在列挙値をサポートしていないため、整数値と比較する必要があります(値InvoiceStatuses.Receivedでない場合は、enumこの部分を無視してください)。

両方の修正を組み合わせると、次のクエリアプローチが実行され、結合と同等の結果が得られます。

int statusReceived = (int)InvoiceStatuses.Received;
var areaIds = user.Areas.Select(x=> x.AreaId).ToArray();

var taskList = from i in _db.Invoices
               where i.Status == statusReceived && areaIds.Contains(i.AreaId)
               select i;
于 2012-04-09T20:52:20.027 に答える