2014-02-06 58 views
2

我正在将两个linq查询集中到一个查询中。基本上我试图通过以下查询来实现的是获取与用户相关的所有信息,而不管他们是否有任何订单。Linq to Entities left join return 0 records

正如我目前编写的查询,它完美的工作,只要至少有一个用户ID的订单,我正在传递给方法。

我的理解是.DefaultIfEmpty()是linq的SQL左连接的等价物,但以下查询返回尚未下订单的任何用户的0记录。

查询

var orders = (from u in db.people where u.id == UserId 
         join o in db.product_transactions.DefaultIfEmpty() on u.id equals o.user_id 
         join sta in db.order_statuses.DefaultIfEmpty() on o.order_status equals sta.id 
         join ship in db.shipping_types.DefaultIfEmpty() on o.shipping_type equals ship.shipping_id 
         select new { o, u, sta, ship }).ToList(); 

回答

3

有两种方法来创建一个左连接使用fromWhere

使用 intofrom

join o in db.product_transactions on u.id equals o.user_id into og 
from o in og.DefaultIfEmpty() 

2)

1)

from o in db.product_transactions.Where(x => u.id == x.user_id).DefaultIfEmpty() 
2

.DefaultIfEmpty()不是左连接语法。 .DefaultIfEmpty()是左连接语法的一部分,如果单元格为空,它将为您提供默认值。

An example left join from MSDN,注意进出。

var query = from person in people 
      join pet in pets on person equals pet.Owner into gj 
      from subpet in gj.DefaultIfEmpty() 
      select new { person.FirstName, PetName = (subpet == null ? String.Empty : subpet.Name) };