2011-07-22 5 views
2

私は(「へ」を使用して)最初の方法の例をたくさん見つけLINQLINQ左外側は、構文の違いを登録しよう

class Customer 
{ 
    public int ID { get; set; } 
    public string Name { get; set; } 
} 

class Order 
{ 
    public int ID { get; set; } 
    public string Product { get; set; } 
} 

    static void Main() 
    { 
     // Example customers. 
     var customers = new Customer[] 
     { 
      new Customer{ID = 5, Name = "Sam"}, 
      new Customer{ID = 6, Name = "Dave"}, 
      new Customer{ID = 7, Name = "Julia"}, 
      new Customer{ID = 8, Name = "Sue"}, 
      new Customer{ID = 9, Name = "Joe"} 
     }; 

     // Example orders. 
     var orders = new Order[] 
     { 
      new Order{ID = 5, Product = "Book"}, 
      new Order{ID = 6, Product = "Game"}, 
      new Order{ID = 7, Product = "Computer"}, 
      new Order{ID = 8, Product = "Shirt"}, 
      new Order{ID = 8, Product = "TShirt"} 
     }; 


     // First Way 
     var query = from c in customers 
       join o in orders on c.ID equals o.ID into co 
       from x in co.DefaultIfEmpty() 
       where x != null && x.Product == "Shirt" 
       select new {c, x}; 

     // Second Way 
     var query2 = from c in customers 
        from o in orders 
        where c.ID == o.ID && o.Product == "Shirt" 
        select new {c, o}; 
    } 

に参加、それは方法ですLEFT OUTERを行うための少なくとも2つの方法があります。私はLEFT OUTER JOINSをしていました。最近、私は第2の方法を見つけました、そして、それはより簡単であるように見えます。私はテストし、両方とも同じ結果を生み出します。今私の質問は、隠れた違い、パフォーマンス、またはそれは構文的な砂糖だけですか?

ありがとうございます。

+4

はなぜ地球上であなたはきっと、これは単にストレート内部にあるため!= nullのチェックを結合する必要があり、左外部結合を使用している取得する?

Bobに感謝します。 –

答えて

6

あなたは!= nullのチェック

に左の外を使用していない場合、最初の方法が使用されるべきでは何の一致が存在しない場合は、右側のテーブルに一致するすべての項目を左テーブルからすべてを選択し、参加します右側のテーブルでは結果は返されますが、右側のテーブルの値はnullです(linqはこれをコレクション項目タイプのデフォルト値として変換します)

両方のクエリが効果的に内部結合を実行するため、 。異なる結果

// First Way 
var query = from c in customers 
join o in orders on c.ID equals o.ID into co 
from x in co.DefaultIfEmpty() 
where c.Id>5 
select new {c, x}; 

// Second Way 
var query2 = from c in customers 
from o in orders 
where c.ID == o.ID && c.ID > 5 
select new {c, o}; 
+0

あなたが正しい場合、私は!= nullチェックを使用すると、この場合両方の内部結合になります。再度、感謝します。 –

関連する問題