2012-02-22 14 views
0

私はこの方法を持っている:"型の定数値を作成できません。" LINQクエリでこのエラーを回避する方法は?

public virtual IEnumerable<Invoice> GetHomePageInvoices(IList<Area> areas, FinancialYearLookup financialYear) 
{ 
    var homePageInvoices = _db.Invoices.Where(x => areas.Any(z => z.Id == 3)).ToList(); 

    ... 
} 

は基本的に私は、面積がパラメータ領域内の任意のものと一致するすべての請求書を見つけようとしています。

私はエラーを取得しています:これが起こって、どのように修正することですなぜ

Unable to create a constant value of type 'Models.Area'. Only primitive types ('such as Int32, String, and Guid') are supported in this context.

は、誰もが説明できますか?

あなたが(エンティティにおそらくLINQの)あなたのLINQプロバイダのコンテキストで IList<Area>を使用することはできません
+3

どのLINQプロバイダーをお使いですか? LINQ to SQL?エンティティへのLINQ?他に何か? – svick

+0

Linq to Entities – AnonyMouse

答えて

5

- ちょうどIDの事前抽出し、プリミティブのコレクションで作業を行うContainsクエリを使用します。

List<int> ids = areas.Select(x=> x.Id).ToList(); 
var homePageInvoices = _db.Invoices 
          .Where(x => ids.Contains(x.Id)) 
          .ToList(); 

3の固定値と比較したくないと思うので、私はそれに応じてクエリを変更しました - InvoiceエンティティにはIdプロパティがあります。

0

a。

z => z.Id == 3 

が、主な問題は、 Bです:あなたがここにタイプミスを持っているように見えます。私はEntityにLinqを使用していると推測していますが、明確ではありません。いずれにしても、クエリビルダは、 'areas.Any(...)'をSQLに変換しようとしていますが、領域はデータベースのIQueryableではなくローカル変数であるため、実行できません。私はあなたがこのような何かを使用することをお勧めします。hereまたはhereと記載されているカスタムLinq演算子。これは、あなたが照合したいかもしれない領域のすべての項目を含むSQL in節を構築します。

関連する問題