【问题标题】:Full outer join two lists of separate classes into a third list of a third class完全外连接两个单独的类列表到第三个类的第三个列表
【发布时间】:2015-03-14 00:28:20
【问题描述】:

我正在尝试完全外部加入两个列表(不同的类),我必须这样做的原因是因为我需要来自我的系统的所有订单,以及来自另一个系统的订单。有些订单在 ordernumber 上匹配,有些不匹配。但我仍然想在网格中显示所有订单。

两个界面是这样的

     interface IOrderInternal
     {
          int ID { get; } // My systems inernal ID
          string NO_Order { get; } // My external ID
          DateTime? OrderDate { get; }
     }

     interface IOrderExternal
     {
          int ID { get; } // External systems internal ID
          string ProjectNumber{ get; }
     }

这两个接口的连接最终应该是

     interface IOrderInternal
     {
          int ID_IN { get; set; }
          int ID_EX { get; set; }
          string ProjectNumber{ get; set; }
          DateTime OrderDate { get; set; }
     }

所以两个列表被传入一个函数,应该完全外连接它们,基于 NO_Order = ProjectNumber

     IList<IOrderInternal> INOrders
     IList<IOrderExternal> EXOrders

     var leftJoin = from exorder in EXOrders
                    join inorder in INOrders
                        on exorder.ProjectNumber equals inorder.NO_Order
                    into temp 
                    from inorder in temp
                    select new Order
                    {
                        ID_IN = inorder == null ? default(int) : inorder.ID,
                        ID_EX = exorder.ID,
                        ProjectNumber = inorder == null ? default(string) : inorder.NO_Order
                        OrderDate = inorder == null ? default(DateTime) : inorder.OrderDate
                    };

     var rightJoin = from inorderin INOrders
                    join exorderin EXOrders
                        on inorder.NO_Order equals exorder.ProjectNumber
                    into temp 
                    from exorder in temp
                    select new Order
                    {
                        ID_IN = inorder.ID,
                        ID_EX = exorder == null? default(int) : exorder.ID,
                        ProjectNumber = inorder.NO_Order
                        OrderDate = inorder.OrderDate
                    };

     var joinedList = leftJoin.Union(rightJoin);

当我加入列表时,我只会得到内部连接的结果。但我需要知道所有订单的总和。

任何帮助表示赞赏:)

【问题讨论】:

  • 我假设在你的接口定义中,一个应该命名为IOrderExternal 而不是IOrderInternal,并且连接的接口也应该有一个不同的名称。
  • 谢谢,现在编辑!

标签: c# linq outer-join


【解决方案1】:

如果我理解正确,您想在任一方向进行外连接,然后将结果连接在一起吗?这就是我在 linq 中进行左连接的方式:

 IList<IOrderInternal> INOrders
 IList<IOrderExternal> EXOrders

 var leftJoin = from exorder in EXOrders
                from inorder in INOrders.Where(x => exorder.ProjectNumber == x.NO_Order).DefaultIfEmpty()
                select new Order
                {
                    ID_IN = inorder == null ? default(int) : inorder.ID,
                    ID_EX = exorder.ID,
                    ProjectNumber = inorder == null ? default(string) : inorder.NO_Order
                    OrderDate = inorder == null ? default(DateTime) : inorder.OrderDate
                };

 var rightJoin = from inorderin INOrders
                from exorderin EXOrders.Where(x => inorder.NO_Order == x.ProjectNumber).DefaultIfEmpty()
                select new Order
                {
                    ID_IN = inorder.ID,
                    ID_EX = exorder == null? default(int) : exorder.ID,
                    ProjectNumber = inorder.NO_Order
                    OrderDate = inorder.OrderDate
                };

 var joinedList = leftJoin.Union(rightJoin);

我喜欢这种方式,因为它将左连接全部放在一行上,但如果您想继续使用您的语法,我认为您只需在每个查询中将 temp 更改为 temp.DefaultIfEmpty() 即可工作。

【讨论】:

  • 太棒了,谢谢!我的工作似乎很有魅力,虽然没有完全检查过他的数据,但计数器似乎是正确的!再次感谢:)
猜你喜欢
  • 1970-01-01
  • 2015-04-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-16
  • 2021-05-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多