2012-09-05 12 views
5

これにより、今日は問題が終了していません。私はこのクエリの最後の行は私に問題Entity Framework: 'System.Collections.Generic.IList`1'の定数値を作成できません

(criteria.Locations == null || 
criteria.Locations.Count == 0 || 
a.AccommodationPlaceJoins.Any(j => criteria.Locations.Contains(j.Place.PlaceName))) 

それが与えるエラーさの原因になっている

var result = 
    DataContext.Accommodations.Where(a => 
     (criteria.MinPrice == null || a.AccommodationRates.Any(r => r.From >= criteria.MinPrice)) && 
     (criteria.MaxPrice == null || a.AccommodationRates.Any(r => r.To <= criteria.MaxPrice)) && 
     (criteria.Locations == null || criteria.Locations.Count == 0 || a.AccommodationPlaceJoins.Any(j => criteria.Locations.Contains(j.Place.PlaceName))) 
); 

この単純なクエリを持って

」タイプ の一定の値を作成することができません

System.Collections.Generic.IList`1 '。このコンテキストでは、プリミティブ型( ' Int32、String、およびGuid'など)のみがサポートされています。

私はリストを作成しようとしていません。私がここでやろうとしていることは、場所に関連付けられている宿泊施設を戻すことです(AccommodationPlaceJoinテーブルを介して宿泊施設テーブルにリンクされているPlaceテーブルの場所名が基準内の場所名のいずれかと等しい) .Locations(IList型です)。

私はこの行をこれに変更しようとしましたが、動作しませんでした。作成することはできません

(criteria.Locations == null || 
criteria.Locations.Count == 0 || 
a.AccommodationPlaceJoins.Any(j => criteria.Locations.Any(l => l == j.Place.PlaceName))) 

答えて

29

定数EFは、比較のためにcriteria.Locations == nullnullです。

var result = DataContext.Accommodations.Where(a => 
    (criteria.MinPrice == null || 
     a.AccommodationRates.Any(r => r.From >= criteria.MinPrice)) && 
    (criteria.MaxPrice == null || 
     a.AccommodationRates.Any(r => r.To <= criteria.MaxPrice))); 

if (criteria.Locations != null && criteria.Locations.Count > 0) 
{ 
    result = result.Where(a => a.AccommodationPlaceJoins 
     .Any(j => criteria.Locations.Contains(j.Place.PlaceName))); 
} 

編集を

ところで:あなたはそうのように、たとえば、2例にクエリを分割し、クエリの外の空のリストのチェックを行う必要があり、それになるだろう全体のクエリを構成します私の意見では読みやすく、データベースに送られなければならないSQLを簡素化します:

IQueryable<Accommodation> result = DataContext.Accommodations; 

if (criteria.MinPrice != null) 
    result = result.Where(a => a.AccommodationRates 
     .Any(r => r.From >= criteria.MinPrice)); 

if (criteria.MaxPrice != null) 
    result = result.Where(a => a.AccommodationRates 
     .Any(r => r.To <= criteria.MaxPrice)); 

if (criteria.Locations != null && criteria.Locations.Count > 0) 
    result = result.Where(a => a.AccommodationPlaceJoins 
     .Any(j => criteria.Locations.Contains(j.Place.PlaceName))); 
+0

うわー、どんなに素晴らしい答えですか?感謝万円。私は非常に多くの間違った調査のラインを下った。 +1ありがとうございました。あなたが29Kポイント近く持っているのも不思議ではありません。とにかくこれはどうして起こるのですか? –

+0

私はあなたの可読性の提案に沿ってリファクタリングしています。ありがとうございました。 –

+1

@SachinKainth:LINQ to Entitiesでは、問合せのすべての式および式フラグメントをSQLに変換できる必要があるため、例外が発生します。比較 'criteria.Locations == null'はクライアント(= .NET)側では実行されませんが、EFはそれをSQLに変換したいので、データベースは比較を実行する必要があります。しかし、データベースは.NET/CLRオブジェクト参照を比較する方法を知らず、文字列、intなどのプリミティブ型だけをNULLでチェックすることができます。 SQLへの変換はできません - >例外。 – Slauma

関連する問題