2015-01-15 73 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

相關問題