2009-04-29 9 views
1

Entity Frameworkオブジェクトに対してLINQクエリが実行されています。ここでは、クエリの要約は次のとおりです。基本的にはLINQ to Entity: "選択"部分にContainsが含まれていると予期しないエラーが発生する

//a list of my allies 
List<int> allianceMembers = new List<int>() { 1,5,10 }; 

//query for fleets in my area, including any allies (and mark them as such) 
var fleets = from af in FleetSource 
      select new Fleet 
      { 
       fleetID = af.fleetID, 
       fleetName = af.fleetName, 
       isAllied = (allianceMembers.Contains(af.userID) ? true : false) 
      }; 

、艦隊のセットを取得しているものを私がやっています。 allianceメンバーリストには、私と同盟関係にあるすべてのユーザーのINTが含まれています。艦隊の所有者がそのリストの一部であればisAllied = trueを設定し、そうでない場合はfalseを設定したいと思います。私が含まれている使用していた場合、私はこのエラーを取得して理解することができます

「エンティティへのLINQのメソッド 『ブールが含まれています(Int32)を』メソッドを認識しない」:

私はこれを行う

が、私は例外を見ていますクエリのどこの部分が、なぜ私はそれをselectで取得できますか?この時点までに、クエリが実行され、結果が返されると仮定します。このコードは、データを制約するものではありません。

私はisAlliedフラグを設定して、私が必要とするものを達成するためのヒントを教えてください。

おかげ

+1

次のバージョンのEntity Frameworkで 'Contains' *がサポートされることに注意してください。 –

答えて

-2
var fleets = from af in FleetSource; 

var x = from u in fleets.ToList() 
         select new Fleet 
         { 
          fleetID = u.fleetID, 
          fleetName = u.fleetName, 
          isAllied = (allianceMembers.Contains(u.userID) ? true : false) 
         } 

、後であなたはContains()を使用することができ、クエリが実行された艦隊のToList()を呼び出す:あなたの代わりに何ができるか

は、データベースからあなたの艦隊を取得し、後でisAlliedプロパティを設定しています。

+7

元のクエリを正常に動作させるには、allianceMembersオブジェクトをドラッグしないで、すべてのオブジェクトをメモリにドラッグしませんか? –

4

前の回答から、この密猟...

がサポートされていませんが含まれています。

INとJOINは同じ演算子ではありません(INによるフィルタ処理は問合せのカーディナリティを変更しません)。

このようにする代わりに、joinメソッドを使用します。クエリ演算子を使用しないと理解するのはやや難しいですが、一度取得すれば得られます。ここで

var foo = 
model.entitySet.Join( //Start the join 
values, //Join to the list of strings 
e => e.Name, // on entity.Name 
value => value, //equal to the string 
(ModelItem ent, String str) => ent);//select the entity 

それは

var foo = from e in model.entitySet 
join val in values on 
e.Name equals val 
select e; 
+0

私の場合の結合は意味をなさない。何とか私のデータを制限しようとしていたら、私はそうではありません。包含は選択部分で起こります。 – bugfixr

2

は、基本的には、エンティティフレームワークは、SQL文の中に、あなたのLINQクエリを変換しようとしたがContainsを処理する方法を知っていないクエリ演算子を使用しています。

var fleets = (from af in FleetSource 
       select new Fleet 
       { 
        fleetID = af.fleetID, 
        fleetName = af.fleetName, 
        userId = af.userId 
       }).AsEnumerable(); 

foreach (var fleet in fleets) 
{ 
    fleet.isAllied = (allianceMembers.Contains(fleet.userID) ? true : false); 
} 
0

私の上の誰もが間違っています! (違反しません...) "Contains"のIEnumerableオーバーロードではなく、 "Contains"のIListオーバーロードを使用しているため、動作しません。単純に変更します。<int>を追加することにより

allianceMembers.Contains<int>(af.userID) 

、あなたの代わりにIListの過負荷のIEnumerableをオーバーロードを使用するようにコンパイラに指示してい。

+10

彼らがあなたの上にいるのは、彼らが皆あなたよりもそれほど間違っていないということです。 –

関連する問題