2009-04-30 13 views
0

私はLinqで実行する必要がある文に似ています。私は.Containsを使用する道を始め、最初の層を稼働させることができますが、追加の層を得るために何をする必要があるのか​​分からないようです。ネストされたSQL文をLINQに変換する際の助けが必要

ここでは、SQL文です:

select * 
from aTable 
where aTableId in 
    (select aTableId from bTable 
    where bTableId in 
     (select bTableId from cTable 
     where cTableId in 
      (select cTableId from dTable 
      where dField = 'a guid' 
      ) 
     ) 
    ) 

答えて

3

まあは、最も簡単な翻訳は次のようになります。

var query = from a in aTable 
      join b in bTable on a.aTableId equals b.aTableId 
      join c in cTable on b.bTableId equals c.bTableId 
      join d in dTable on c.cTableId equals d.cTableId 
      where d.dField == "a guid" 
      select a; 

var query = from a in aTable 
      where (from b in bTable 
        where (from c in cTable 
          where (from d in dTable 
           where dField == "a guid" 
           select d.cTableId) 
           .Contains(c.cTableId) 
          select c.bTableId) 
         .Contains(b.bTableId) 
        select b.aTableId) 
        .Contains(a.aTableId) 
      select a; 

しかし、参加が大幅に簡素であろうと思われます私はチェックしていませんが、私はと思って彼らはsaを行うでしょう私のこと...

+0

それは私が必要なものです。唯一の追加は.Containsステートメントで型を定義することでした。 ie:.Contains((Guid)a.aTableId) –

+0

これらのオプションのSQLは異なりますが、実行計画は同じです。 Joinsを使用する2番目のオプションは、はるかに判読可能なソリューションです。 –

関連する問題