我正在努力将两个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();
答案 0 :(得分:3)
有两种方法可以创建左连接
1)使用into
和from
join o in db.product_transactions on u.id equals o.user_id into og
from o in og.DefaultIfEmpty()
2)使用from
和Where
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) };