【问题标题】:join not returning all elements in left table C# lambda加入不返回左表C# lambda中的所有元素
【发布时间】:2013-10-31 15:09:50
【问题描述】:

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

【问题讨论】:

  • 这不是 Lambda 中的左连接

标签: c# linq join


【解决方案1】:

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

此查询选择与位置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 文章:How to: Perform Left Outer Joins

【讨论】:

  • 谢谢,这正是我所需要的,我同意这比使用 lamdas 更具可读性
  • @mmilan 我还添加了 lambda 语法,如果您出于某种原因需要它(但它真的很难阅读和理解)
【解决方案2】:

我的加入会缺少什么?

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-06-10
    • 2012-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-25
    • 2015-08-29
    • 1970-01-01
    相关资源
    最近更新 更多