2011-11-24 14 views
10

私は、1対多数のマッピングを持つテーブルを、別のテーブルへの多対多マッピングを持つテーブルに持っています。次のようにしたいと思います:エンティティへのlinq、where where節? (inner where)

var results = context.main_link_table 
        .Where(l => l.some_table.RandomProperty == "myValue" && 
          l.some_table.many_to_many_table 
          .Where(m => m.RandomProperty == "myValue")); 

どうすればいいですか?最初の部分はうまくいきますが、 '内側のWHERE'がなければ、many_to_many_tableのプロパティにアクセスすることはできませんが、内部の場所は明らかにコンパイルされません。私は基本的に次のSQLクエリのような何かを達成したい:

SELECT * from main_link_table 
INNER JOIN some_table AS t1 ON t1.association = main_link_table.association 
INNER JOIN many_to_many_table AS t2 ON t2.association = some_table.association 
WHERE t1.RandomProperty = 'MyValue' AND t2.RandomProperty = 'MyValue' 

それは一見シンプルですが、私は、LINQの1つの行でそれを達成するための方法を見つけることができません - 所望の効果を達成するために複数行を使用すると、あまりにも返します多くの結果と私はそれらをループする必要があります。私はまた、のようなものを試してみました:

var results = main_link_tbl.Include("some_table.many_to_many_table") 
          .Where(l => l.some_table.many_to_many_table.<property> 
             == "MyValue") 

しかし、私はそれがすべてのレコードを検索しませんので、効果を無効FirstOrDefault()を、追加しない限り、この時点で私はmany_to_many_tableのプロパティを選択することはできません。

仕事をした何

が、コードの複数行を必要とし、バックグラウンドでLINQツーエンティティフレームワークによって構築されたSQLクエリであまりにも多くの結果を返します。

var results = db.main_link_table.Include("some_table") 
           .Include("some_table.many_to_many_table") 
           .Where(s => s.some_table.RandomProperty 
              == "myValue") 
           .Select(s => s.some_table); 

foreach(var result in results) { 
    var match_data = result.Where(s => s.many_to_many_table.RandomProperty 
             == "myValue"); 
} 

コードのこの作品は、すべて返されます最初のWhere条件に一致し、次にWhere条件を適用するsome_table内の行。ただし、many_to_many_table.RandomPropertyがmyValueと等しい行が1つだけ必要です。

答えて

16

あなたは、内側WhereAnyに変更した場合、それは動作するはずです:魔法のように

var results = context.main_link_table 
        .Where(l => l.some_table.RandomProperty == "myValue" && 
           l.some_table.many_to_many_table 
            .Any(m => m.RandomProperty == "myValue")); 
+0

作品。 – L2Eer

+0

非常に美しいです。 – qakmak

4

参加を希望する場合は、参加をしないでください。

あなたのSQLはまったく同じものを達成する必要があり
var query = from main in context.MainLinks 
      join t1 in context.Some on main.Association equals t1.Association 
      where t1.RandomProperty == "MyValue" 
      join t2 in context.ManyToMany on t1.Association equals t2.Association 
      where t2.RandomProperty == "MyValue" 
      select new { main, t1, t2 }; 

...

1
from link in db.main_link_table 
join s in db.some_table on link.association1 = s.association 
join m in db.many_to_many_table on link.association2 = m.association 
where s.X = 'MyValue' AND m.Y = 'MyValue' 
select m; // or s or link or both 3 as you want