我正在嘗試對 2 個串列執行左連接,我的查詢遇到問題,如果右串列為空,則左連接失敗。如何更改查詢,以便即使串列為空,左連接仍然有效
示例查詢:
var received = new List<Foo>{new Foo{ProductId=1,WarehouseSectionId=2, qty= 7}};
var reserved = new List<Foo>{};
var leftOuterJoin = from r in received
join rs in reserved.DefaultIfEmpty()
on new {a = r.ProductId, b = r.WarehouseSectionId } equals new { a = rs.ProductId, b = rs.WarehouseSectionId } into joinedL
from rs in joinedL.DefaultIfEmpty()
select new Foo{
qty = rs != null ? r.qty rs.qty: r.qty};
.NetFiddle 實作問題 https://dotnetfiddle.net/Brh74F
現在我可以使用 if 陳述句來避免這個問題,但我真的希望能夠在純 linq 中實作正確的左連接。
uj5u.com熱心網友回復:
洗掉.DefaultIfEmpty()在
join rs in reserved.DefaultIfEmpty()
洗掉的原因.DefaultIfEmpty()為:
public static System.Collections.Generic.IEnumerable<TSource> DefaultIfEmpty<TSource> (this System.Collections.Generic.IEnumerable<TSource> source, TSource defaultValue);
退貨
IEnumerable<TSource>如果源為空,則包含 defaultValue 的 IEnumerable;否則,來源。
由于您沒有傳遞defaultValue給.DefaultIfEmpty(),它會null在reserved為空串列時回傳。
并且select r因為您想從LEFT表中回傳資料。
var leftOuterJoin = from r in received
join rs in reserved
on new { a = r.ProductId, b = r.WarehouseSectionId } equals new { a = rs.ProductId, b = rs.WarehouseSectionId } into joinedL
from rs in joinedL.DefaultIfEmpty()
select r;
示例程式
更新:
如果您正在訪問RIGHT表 ( rs),您需要對 null 情況null checking進行rs first和 next 處理。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/342486.html
