2009-07-28 5 views
1

ネストされたオブジェクトのリストを取得しているLINQクエリがあります。このLINQクエリを書き直して、1つのSQLクエリのみを実行する方法はありますか?

from c in ClientsRepository.LoadAll() 
orderby c.Name 
select new ComboBoxOptionGroup 
    { 
    Text = c.Name, 
    Options = from p in c.Projects 
       orderby p.Name 
       select new ComboBoxOption 
       { 
        Text = p.Name, 
        Value = p.ID.ToString() 
       } 
    } 

残念ながら、このLINQクエリはnum(クライアント)+1のSQLクエリになります。 1つのSQLクエリでしか結果が得られないように、これを書き換えるエレガントな方法はありますか?

私の考えは、クライアントから注文されたすべてのプロジェクトをフェッチし、2つのネストされたforeachループで残りの作業を行うことですが、それはLINQの設計時に意図された優雅さに反しているようです。より良い選択肢はありますか?

答えて

2

を。クエリの一部を返す場合(戻り値はIQueryable<T>)、それが可能でなければなりません。

しかし、データ(またはオブジェクト)コンテキストがどこにあるのかわからなくても、モデルは難しいです。 DataLoadOptionsを使用する別の可能な選択肢は次のようになり

from client in dataContext.Clients 
join p in dataContext.Projects on p.ClientId equals c.Id 
    into projects 
orderby client.Name 
select new ComboBoxOptionGroup { 
    Text = client.Name, 
    Option = from p in projects 
      orderby p.Name 
      select new ComboBoxOption { 
      Text = p.Name, 
      Value = p.ID.ToString() 
      } 
} 
1

あなたはpropably演算子「参加」を検索:ClientsRepository.LoadAll()は(IQueryable<T>を返さない)、実際にデータベースに行き、データを取得することを、クエリのラッパーであるならば、あなたが立ち往生しているhttp://www.hookedonlinq.com/JoinOperator.ashx

+0

ヒントをありがとう。私は実際に結合演算子を認識していましたが、このケースではそれが当てはまるとは思いませんでした。実際にJoinがGroupJoinになったとは思っていませんでした。 –

2

通常、私のような何かを行うことを期待します。

DataLoadOptions dlo = new DataLoadOptions(); 
dlo.LoadWith<Client>(c => c.Projects); 
context.DeferredLoadingEnabled = false; // You may not need/want this line 
context.LoadOptions = dlo; 

私はそれを行うためのこの方法をテストしていませんが、あなたはうまくいけば一人でクエリを残して、必要なクエリの数を減らすことができるでしょう。

+0

興味深い!私は以前これについて聞いたことがない。 –

+0

これはあなたのために働くかどうか私に教えてください - 私が言ったように、私はそれをテストしていないので、私はそれがどのように実行するか見るために興味があるでしょう。 –

関連する問題