語境
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
有關如何設定資料庫的資訊,請參閱專案自述檔案:
https://github.com/dharmatech/TSqlEf
uj5u.com熱心網友回復:
對于方法語法中的左連接,您需要將 GroupJoin 與方法 DefaultIfEmpty 和 SelectMany 一起使用。嘗試使用以下查詢,
var result = db.Customers.GroupJoin(
db.Orders,
cust => customer.Custid,
ord => order.Custid,
(cust, ord) => new {cust, ord})
.SelectMany(c => c.ord.DefaultIfEmpty(), (customer, order) =>
new
{
customer.Custid,
customer.Companyname,
orderid = order.Orderid
}
);
uj5u.com熱心網友回復:
伊萬·斯托耶夫的建議
Ivan 在上面的評論中建議這可以使用導航屬性來完成。這是基于他的建議的完整方法:
var result = db.Customers.SelectMany(
customer => customer.Orders.DefaultIfEmpty(),
(customer, order) => new
{
customer.Custid,
customer.Companyname,
orderid = order == null ? -1 : order.Orderid
});
到目前為止,它似乎是最簡單和最直接的。謝謝伊萬!
uj5u.com熱心網友回復:
阿布的回答
這是一個基于阿布回答的版本。我不得不添加這個條件:
orderid = order == null? -1 : order.Orderid
讓它作業。我還更改了一些命名。但是,它似乎確實有效!
var result = db.Customers.GroupJoin(
db.Orders,
customer => customer.Custid,
order => order.Custid,
(customer, orders) => new { customer, orders })
.SelectMany(
customer_orders => customer_orders.orders.DefaultIfEmpty(),
(customer_orders, order) => new
{
customer_orders.customer.Custid,
customer_orders.customer.Companyname,
orderid = order == null? -1 : order.Orderid
});
類似問題
看到這個類似的問題:
LINQ 中的左外連接
它包含一個類似于 Abu 方法的答案。
uj5u.com熱心網友回復:
凱厄斯·賈德的建議
Caius 提到,出于構建報告的目的,可以采用嵌套foreach方法。以下是基于他的建議的方法:
foreach (var customer in db.Customers.Include(customer => customer.Orders))
{
if (customer.Orders.Any())
{
foreach (var order in customer.Orders)
{
Console.WriteLine("{0} {1} {2}",
customer.Custid,
customer.Companyname,
order.Orderid);
}
}
else
{
Console.WriteLine("{0} {1} {2}",
customer.Custid,
customer.Companyname,
-1);
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/351622.html
