簡體   English   中英

join不返回左表C#lambda中的所有元素

[英]join not returning all elements in left table C# lambda

我有2個表,左表有這樣的數據:

在此輸入圖像描述

我使用以下表達式與另一個表進行左連接:

 var result = posicion.Join(fact,
                            p => p.Cod_articulo,
                            f => f.Cod_articulo,
                            (p, f) => new { p.Posicion, p.Cant_historico, 
                                            p.Cod_articulo, f.Cantidad_facturada });

問題是結果不包括左表中的一些項目,如下所示:

在此輸入圖像描述

正如您在結果中看到的那樣,位置3,6等沒有數據。我的加入中會缺少什么?

您需要進行組連接(即Linq中的左連接)。 最好使用查詢語法:

from p in posicion
join f in fact
    on p.Cod_articulo equals f.Cod_articulo into g // GroupJoin
from pf in g.DefaultIfEmpty()
select new { 
   p.Posicion, 
   p.Cant_historico, 
   p.Cod_articulo, 
   Cantidad_facturada = (pf == null) ? null : pf.Cantidad_facturada 
}

該查詢將與posicion p對應的所有事實選擇到組g 然后從每個組中選擇結果,即使當前位置沒有相應的事實(即DefaultIfEmpty情況)。

Lambda語法的可讀性要低得多:

posicion.GroupJoin(fact,
                   p => p.Cod_articulo,
                   f => f.Cod_articulo,
                  (p, g) => new { p, g })
        .SelectMany(x => x.g.DefaultIfEmpty(), (x, pf) => new {
                x.p.Posicion, 
                x.p.Cant_historico, 
                x.p.Cod_articulo, 
                Cantidad_facturada = (pf == null) ? null : pf.Cantidad_facturada 
        });

還要考慮閱讀這篇MSDN文章: 如何:執行左外連接

我的加入會遺漏什么?

據推測, fact沒有條目具有相應的Cod_articulo值(例如,對於位置3為60155)。 LINQ中的Join表示內部Join ,其中必須在兩個源中都有一個條目才能創建適當的結果。

如果你想要一個左連接,你通常使用GroupJoin ,這樣“左”側的每個元素最終都匹配來自“右”側的一組條目,其中該組可能是空的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM