2015-01-15 43 views
0

我想完全外连接两个列表(单独的类),我必须这样做的原因是因为我需要所有的命令从我的系统,以及来自另一个系统的订单。有些订单与订单号匹配,有些订单不匹配,但我仍然想要在网格中显示所有订单。完全外连接两个不同类的列表到第三类的第三个列表

两个接口看起来像这样

 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; } 
    } 

的加盟HESE两个接口应该最终会被

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

所以两个列表中应该完全外连接它们的函数传入,基于NO_Order =项目编号

 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); 

当我加入列表我只ge t内连接的结果。但我需要知道所有的订单。

任何帮助表示赞赏:)

+0

我假定在你的接口的定义中,一个应该被命名为'IOrderExternal'而不是'IOrderInternal',并且连接的接口也应该有一个不同的名字。 – juharr

+0

谢谢,现在就编辑它! – Alex

回答

0

如果我理解正确的话,你想要做外连接在任何一个方向,然后将结果串联起来呢?这就是我左边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); 

我喜欢这种方式,因为它使左连接都在同一行,但如果你想继续使用你的语法,我想你只需要改变temptemp.DefaultIfEmpty()在每个查询让它工作。

+0

太棒了,谢谢!我似乎像一个魅力一样工作,虽然没有完全检查他的数据,但柜台似乎是正确的!再次感谢 :) – Alex

相关问题