Linq to Entities左连接返回0记录

时间:2014-02-06 18:13:26

标签: c# linq entity-framework

我正在努力将两个linq查询压缩到一个查询中。基本上我试图通过以下查询实现的是获取与用户相关的所有信息,无论他们是否有任何订单。

正如我当前编写的查询一样,只要我传入方法的用户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();

2 个答案:

答案 0 :(得分:3)

有两种方法可以创建左连接

1)使用intofrom

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

2)使用fromWhere

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

答案 1 :(得分: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) };