2012-01-21 7 views
4

が、私は単純なクエリに()が含まれて使用するようにしようとしているが、それは誤りで、失敗している含まれています:タイプの定数値「NewsletterApp.Models.NewsletterUser」を作成することLINQクエリ

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

編集インテリセンスが実際に()が含まにNewsletterUserを使用するように私に指示 - 「(NewsletterUserアイテム)」私は、.NET 3.5とEFを使用して含まれて使用してオブジェクトを検索の問題は()があったことを読んで

、私は.NET 4.0でEF4.2(4.1も試しました)を使用しています。 コードは次のとおりです。

 var db = new MyContext(); 

     var newsletterUser = db.NewsletterUsers.Find(UserID); 
     var subscriberList = db.Subscribers 
       .Where(x => x.NewsletterList.ListOwner.NewsletterUsers.Contains(newsletterUser)) 
       .ToList(); 

答えて

7

に動作します。この

var db = new MyContext(); 
var newsletterUser = db.NewsletterUsers.Find(UserID); 
var subscriberList = db.Subscribers 
      .Where(x => x.NewsletterList.ListOwner.NewsletterUsers 
        .Any(y => y.UserId == newsletterUser.UserId)) 
      .ToList(); 

どれ()ラムダで指定された基準を満たした項目が存在するかどうかを確認: "y => y.UserId == newsletterUser.UserId"

「このコンテキストでは、 'Int32、String、Guid'などのプリミティブ型のみがサポートされています」というのは、LINQ to Entitiesによって設定された制限によるものです。 LINQ to Entitiesは、データベースに表現できるようにクエリを解決する必要があり、プリミティブ型以外のものではContains()メソッドでクエリを解決することはできません。

メモリコレクション(LINQ to Objects)に対して実行すると、投稿したコードが正常に実行されます。そのため、コンパイラによってフラグが立てられません。

1

質問が間違っています。プロパティやフィールドを比較するのではなく、オブジェクトやエンティティ全体を比較していますが、これはこの方法では実行できません。

次のコードを試してみて、それは私がしたい疑う

var db = new MyContext(); 
var newsletterUser = db.NewsletterUsers.Find(UserID); 
var subscriberList = db.Subscribers 
      .Where(x => x.NewsletterList.ListOwner.NewsletterUsers.UserId.Contains(newsletterUser.UserID)) 
      .ToList(); 
+0

NewsleterUsersはコードが動作しないようにIEnumerableです。インテリセンスの実際は、私にオブジェクト '(NewsletterUser item)'を使用するように指示します。 – Judo

+0

私はあなたの文脈についてあまりよく知らないので、正確な質問を書くことはできません。あなたが望むものについて精緻化して、NewsLetterとSubscribersのエンティティクラスを表示できますか?あなたの質問が主な理由あなたはプロパティやフィールドの代わりにオブジェクトを比較しているからです。このように考えると、class1とclass2を比較できますか? –