2009-08-13 21 views
5

私はお互いに関係のある2つのテーブルを持っていますEntity Frameworkでこれを行うにはどうすればいいですか?

テーブルAはテーブルBと1対多の関係を持っているので、それぞれにナビゲーションプロパティが作成されます。

これでテーブルA(userName)の値をチェックする必要があり、テーブルB(ClubId)の値をチェックする必要があります。

だから私の心の中でそれが

Join the tables together 
Where A.userName == "bob" && 
where B.clubId == "Car" 

// return the count. 

ようなものになるだろうが、今私は、エンティティのものと知っていることは確認する必要があり、私が参加し、その後でそれを行うことができれば私は疑問に思ってあまり一般的で合流します。

私はそれが正しい型(第2回)は戻りませんので、そう、これは動作しません

int count = Entity.TableA.where(a => a.userName == "bob" && a.TableB.where(i => i.ClubId == "Car")).Count(); 

これを試してみました。これは、私がどのようにそれが行われることが期待されるかを線に沿って考えた方法です。

どのように見えるのですか?

P.S

私はむしろ、私は上記のようにやったのLINQメソッドクエリで行う例があります。あなたのEFモデルはユーザーとクラブとの間の関係は、このような何かができていると仮定すると、

答えて

4

フィルタリングTableAは、おそらく、より効率的である:あなたは2つの変数を使用する必要はありません

var clubs = from a in Entity.TableA 
      where a.userName == "bob" 
      from b in a.TableB 
      where b.clubId == "Car" 
      select b; 

var count = clubs.Count(); 

、それはちょうど私の好みはわかりやすくするためにここにあります。

またはメソッドの構文で、あなたは少しを簡素化することができます:

var count = Entity.TableA.Where(a => a.userName == "bob") 
         .SelectMany(a => a.TableB) 
         .Count(b => b.clubId == "Car"); 

しかし、私は、EFは、これらの特定の表現を理解するかどうか分かりません。そうでない場合、コンパイラは上記のようなクエリを次のように変換します。

var count = Entity.TableA.Where(a => a.userName == "bob") 
         .SelectMany(a => a.TableB, (a,b) => new { a, b }) 
         .Where(x => x.b.clubId == "Car") 
         .Count(); 
+0

ああ。 うわー。私は彼の事件をより良く知っているか分からない。そのselectManyは私を捨てます。では、別のフィルタが必要な場合はどうなりますか?別のselectManyを追加しますか? 最初のメソッド構文がうまくいきます。内部的にダウンして2番目のことを行うかどうかはわかりません。すべてのクエリは同じ実行時間を要します。 2番目のものは何ですか?SelectManyは1つではありません。 a => a.TableB、(a、b)=>)は何ですか? – chobo2

+0

私は、クエリ翻訳の修正プログラムで投稿を更新しました。 最初のSelectManyはネストされたコレクションを本質的に「平坦化」し、すべてのAからすべてのBのシーケンスを返します。 2番目のSelectManyは、AからBのコレクションを取得する "collectionSelector"と、AとBを指定して戻り値を指定する "resultSelector"の2つのデリゲートを受け入れます。LINQは、残りのクエリで使用するために、両方の入力オブジェクトを選択するだけです。 – dahlbyk

5

:あなたがユーザーとクラブの両方の要素を返したい場合は

var usersNamedBobInCarClub = 
      from A in User 
      from B in A.Clubs 
      where A.userName == "bob" && 
        B.clubId == "Car" 
      select A; 

は、クエリ内で加入を見てみましょう。ご参加の前に

+0

私はそれを試みますが、どのようにしてLinqメソッドのクエリを実行しますか? – chobo2

関連する問題