4

我有 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 等没有数据。我的加入会缺少什么?

4

2 回答 2

4

您需要进行组加入(即在 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 
}

此查询将所有与 position 对应的事实选择p到 groupg中。然后从每个组中选择结果,即使当前位置没有对应的事实(即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 文章:如何:执行左外连接

于 2013-10-31T15:18:25.130 回答
3

我的加入会缺少什么?

大概没有fact具有相应Cod_articulo值的条目(例如位置 3 的 60155)。Join在 LINQ 中表示内部连接,其中必须在两个源中都有一个条目才能创建适当的结果。

如果您想要左连接,您通常会使用GroupJoin,以便“左侧”侧的每个元素最终匹配来自“右侧”侧的一组条目,其中该组可能为空。

于 2013-10-31T15:12:14.090 回答