2012-03-23 10 views
2

を押すことなくチェック:サブクエリが空の場合、LINQのは、次のように私は、LINQのサブクエリを持つリモートデータベース

 for (int i = 0; i < parentAttributes.Length; i++) 
     { 
      Guid parent = parentAttributes[i]; 
      var subQuery = from sc in db.tSearchCluendexes 
          join a in db.tAttributes on sc.AttributeGUID equals a.GUID 
          join pc in db.tPeopleCluendexes on a.GUID equals pc.AttributeGUID 
          where a.RelatedGUID == parent && userId == pc.CPSGUID        
          select sc.CPSGUID; 

      query = query.Where(x => subQuery.Contains(x.Id)); 
     } 

基本的な考え方は、(クエリ変数によって表されるように)私は、データのリストをフィルタリングすることであるに基づいて、サブクエリの結果は不確定な回数だけ実行されました。

しかし、サブクエリに実際にデータが含まれていて、ループの各繰り返し内でサブクエリを実行したくない場合は、クエリのどこで実行したいかという問題が発生しました(Count ()またはToList())を使用してリモートリソースにヒットします。以下のような何か、我々は法HasData(というそれを取る場合は)実際には、trueまたはfalseを返します:

 for (int i = 0; i < parentAttributes.Length; i++) 
     { 
      Guid parent = parentAttributes[i]; 
      var subQuery = from sc in db.tSearchCluendexes 
          join a in db.tAttributes on sc.AttributeGUID equals a.GUID 
          join pc in db.tPeopleCluendexes on a.GUID equals pc.AttributeGUID 
          where a.RelatedGUID == parent && userId == pc.CPSGUID        
          select sc.CPSGUID; 

      if (subQuery.HasData())     
       query = query.Where(x => subQuery.Contains(x.Id)); 
     } 

提案は歓迎されています。

答えて

4

CountToListを使用することは、クエリに結果があるかどうかを確認する最速の方法ではありません。これはまだすぐに評価されることを

if (subQuery.Any()) 
{    
    query = query.Where(x => subQuery.Contains(x.Id)); 
} 

注:あなたはAnyメソッドを使用する必要があります。実行を遅らせたい場合は、ラムダ関数の中に置くべきです。

query = query.Where(x => !subQuery.Any() || subQuery.Contains(x.Id)); 
+1

ラムダ式の中にAnyを置くことによるメリットはありません – Aducci

+0

ありがとう、私はこれを明日試してみます。ラムダのAny()を実行すると、実行が延期されるか、Aducciからのコメントによると違いはありませんか? – kh25

+0

@ kh25:私は厚くはないAducciはそれは違いがないと言いました。彼は「利益がない」としか言いませんでした。私は彼がそれによって何を意味するのか完全にはわからない。おそらくあなたはそれを試して私たちに知らせることができますか? –

0

マルコ応答のいくつかの非常に詳細なチェックは私がいることを確認できた後に、任意の()それ以外のコードは望ましくない(ループの各反復中にデータベースへの直接呼び出しを行いますようラムダ式にする必要があります)。このコードは、最終的に呼び出されるSQLのステートメントを存在する一連の連結します

 for (int i = 0; i < parentAttributes.Length; i++) 
     { 
      Guid parent = parentAttributes[i]; 
      var subQuery = from sc in db.tSearchCluendexes 
          join a in db.tAttributes on sc.AttributeGUID equals a.GUID 
          join pc in db.tPeopleCluendexes on a.GUID equals pc.AttributeGUID 
          where a.RelatedGUID == parent && userId == pc.CPSGUID        
          select sc.CPSGUID; 


      query = query.Where(x => !subQuery.Any() || subQuery.Contains(x.Id));     
     } 

:あなたは同様の問題を持っている場合は、ここで完全酒のためにそう

は、私が使用することをお勧めしたいコードですプロセスの後の段階。ラムダの外側にAny()がある場合、これらのSQLはすべて個別に呼び出されます。

もう一度Mark - top manに感謝します。