2014-10-20 26 views
0

請幫我幀的LINQ以下條件:使用行明智減法合併兩個表到一個

TBL 1:

ID | Total 
1  20.00 
2  90.00 
3 130.00 

TBL2:

ID | Total 
1  10.00 
2  30.00 

差異表:(TBL1 -tbl2)

ID | Total 
1  10.00 
2  60.00 
3 130.00 

請讓我知道如何框架。

+2

請不要只問我們要解決的問題爲您服務。告訴我們你是如何試圖自己解決問題的,然後向我們展示結果是什麼,並告訴我們爲什麼你覺得它不起作用。請參閱「[您嘗試過什麼?](http://whathaveyoutried.com/)」,以獲得一篇您最近需要閱讀的優秀文章。 – 2014-10-20 19:50:29

+2

這是一個左連接。 http://msdn.microsoft.com/en-us/library/bb397895.aspx – 2014-10-20 19:54:24

+0

如果'tbl2'有一個'tbl1'沒有的ID? – Neolisk 2014-10-20 19:56:05

回答

2

在SQL的世界裏,你把TBL1和union all TBL2與負總,那麼你group byid求和值

var query = from x in tbl1.Concat(tbl2.Select(t => new { ID = t.ID, Total = -t.Total })) 
      group x by x.ID into x 
      select new 
      { 
       ID = x.Key, 
       Total = x.Sum(y => y.Total) 
      }; 
0

這基本上是一個完全外部連接,這可以表示爲聯盟一個左外連接和一個右外連接。

class DataModel 
{ 
    public int ID { get; set; } 
    public decimal Total { get; set; } 

    public override string ToString() { return string.Format("{0}:{1}", ID, Total); } 
    public override int GetHashCode() { return ID; } 
    public override bool Equals(object other) 
    { 
     DataModel otherModel = other as DataModel; 
     if (otherModel == null) return false; 
     return ID == otherModel.ID; 
    } 
} 

IEnumerable<DataModel> table1 = new List<DataModel> { 
    new DataModel { ID = 1, Total = 20m }, 
    new DataModel { ID = 2, Total = 90m }, 
    new DataModel { ID = 3, Total = 130m } 
}; 
IEnumerable<DataModel> table2 = new List<DataModel> { 
    new DataModel { ID = 1, Total = 10m }, 
    new DataModel { ID = 2, Total = 30m }, 
    new DataModel { ID = 4, Total = 15m } 
}; 

IEnumerable<DataModel> leftOuterJoin = from one in table1 
    join two in table2 on one.ID equals two.ID into temp 
    from right in temp.DefaultIfEmpty() 
    select new DataModel { 
     ID = one.ID, 
     Total = one.Total - (right == null ? 0m : right.Total) 
    }; 
IEnumerable<DataModel> rightOuterJoin = from two in table2 
    join one in table1 on two.ID equals one.ID into temp 
    from left in temp.DefaultIfEmpty() 
    select new DataModel { 
     ID = two.ID, 
     Total = (left == null ? 0m : left.Total) - two.Total 
    }; 

IEnumerable<DataModel> difference = leftOuterJoin.Union(rightOuterJoin); 
foreach (DataModel item in difference) 
{ 
    Console.WriteLine(item); 
} 

控制檯輸出爲:

1:10 
2:60 
3:130 
4:-15 

See the fiddle

+0

非常感謝。這工作完美。我已經測試過它。 :) – rahulsen002 2014-10-20 20:41:45