【发布时间】:2021-12-20 11:50:41
【问题描述】:
上下文
Itzik Ben-Gan 的T-SQL Fundamentals Third Edition一书在第 3 章中包含以下查询:
SELECT C.custid, C.companyname, O.orderid
FROM Sales.Customers AS C
LEFT OUTER JOIN Sales.Orders AS O
ON C.custid = O.custid;
我已将其转换为 LINQ,如下所示:
var result =
from customer in db.Customers
join order in db.Orders
on customer.Custid equals order.Custid into Abc
from abc in Abc.DefaultIfEmpty()
select new
{
customer.Custid,
customer.Companyname,
orderid = abc == null ? -1 : abc.Orderid
};
问题
使用方法语法而不是查询语法来编写上述内容的好方法是什么?
我从这个开始:
var result = db.Customers.Join(
db.Orders,
customer => customer.Custid,
order => order.Custid,
(customer, order) =>
new
{
customer.Custid,
customer.Companyname,
orderid = order.Orderid
}
);
但是,这当然会忽略 NULL 值的项目。
我不清楚的部分是如何将into语法转换为方法语法。
欢迎提出任何建议!
注意事项
如果您真的想自己运行查询,上述查询位于此处提供的项目中:
https://github.com/dharmatech/TSqlEf/blob/master/Chapter3p114/Program.cs
有关如何设置数据库,请参阅项目自述文件:
【问题讨论】:
-
@CaiusJard,它不仅缺少
DefaultIfEmpty,而且也没有使用GroupJoin,这似乎是必需的。 -
@CaiusJard,感谢您关于发布答案而不是编辑的建议。我已从问题中删除了答案并将其添加为单独的答案。
-
只有在 Join 丢弃非匹配项(没有任何订单的客户)的意义上它是“必需的”,而 GroupJoin 可以给出“customer_with_list_of_orders_that_may_be_empty”,然后可以用于模拟数据库如何离开联接,因为您拥有这种“列表中具有多个细节的单个主控”结构,可以通过迭代扩展为“N 个主控,具有 N 个细节,每个细节一个重复主控”
标签: c# linq tsql entity-framework-core