2011-07-22 107 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}; 
    } 

JOIN我发现(使用“到”)有很多的第一种方式的例子,那就是这样我曾经做过我的左外连接。最近我找到了第二条路,看起来更简单。我测试了它们并且它们都产生了相同的结果。现在我的问题是否存在任何隐藏的差异,表现,还是仅仅是语法糖?

非常感谢。

+4

,想必这应该只是一个直内加入因!= NULL检查? –

回答

6

第一种方式,应使用,如果你不使用!= 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检查,他们在这种情况下都是内连接。再次感谢。 –