2012-07-11 70 views
4

SQL:Linq union的用法?

SELECT date,total_usage_T1 as TotalUsageValue,'T1' as UsageType FROM TblSayacOkumalari 
UNION ALL 
SELECT date,total_usage_T2 as TotalUsageValue,'T2' as UsageType FROM TblSayacOkumalari 

我嘗試做將其轉換爲LINQ

IEnumerable<TblSayacOkumalari> sayac_okumalari = entity.TblSayacOkumalari 
.Select(x => new 
    { x.date, x.total_usage_T1 }) 
.Union(entity.TblSayacOkumalari.Select(x => new 
    { x.date, x.total_usage_T2 })); 

但我不知道如何'T1' as UsageType轉換爲LINQ。另外我的工會使用也是不正確的。

這樣我的表中的字段:

| date | total_usage_T1 | total_usage_T2 | 

| 2010 |    30 |    40 | 
| 2011 |    40 |    45 | 
| 2012 |    35 |    50 | 

我想這樣

| date | TotalUsageValue | UsageType  | 

| 2010 |    30 |    T1 | 
| 2011 |    40 |    T1 | 
| 2012 |    35 |    T1 | 
| 2010 |    40 |    T2 | 
| 2011 |    45 |    T2 | 
| 2012 |    50 |    T2 | 

我很努力,但不能。請幫忙。

回答

14

編輯

Def. from MSDN 
Enumerable.Concat - Concatenates two sequences. 
Enumerable.Union - Produces the set union of two sequences by using the default equality comparer. 

我的帖子:Concat() vs Union()

IEnumerable<TblSayacOkumalari> sayac_okumalari = 
    entity.TblSayacOkumalari 
    .Select(x => new 
      {  
       date= x.date, 
       TotalUsageValue = x.total_usage_T1, 
       UsageType  = "T1" 
      }) 
    .Concat(entity.TblSayacOkumalari 
     .Select(x => new 
      { 
       date= x.date, 
       TotalUsageValue = x.total_usage_T2, 
       UsageType  = "T2" } 
    )); 

的使用類型,你JUSE需要添加UsageType = "T2"在您新的匿名類型,我這樣做以上,這將做任務給你


比你應該去的毗連方法,而不是聯盟的方法..

int[] ints1 = { 1, 2, 3 }; int[] ints2 = { 3, 4, 5 }; 
IEnumerable<INT> union = ints1.Union(ints2); 
Console.WriteLine("Union"); 
foreach (int num in union) 
{ 
    Console.Write("{0} ", num); 
} 
Console.WriteLine(); 
IEnumerable<INT> concat = ints1.Concat(ints2); 
Console.WriteLine("Concat"); 
foreach (int num in concat) 
{ 
    Console.Write("{0} ", num); 
} 

輸出

enter image description here

事實有關聯盟的毗連

輸出顯示Concat()方法只是將兩個枚舉集合合併爲一個,但是不執行任何操作/處理任何元素只是返回具有兩個可枚舉集合的所有元素的單個可枚舉集合。

Union()方法通過消除重複項來返回可枚舉集合,即如果在執行聯合的可枚舉集合中存在相同元素,則返回單個元素。

重要的一點要注意:

  • 通過該事實,我們可以說,CONCAT()比聯盟(),因爲它沒有做任何處理速度更快。

  • 但是,如果在使用Concat()具有單個集合且具有太多重複元素的數量的情況下合併了兩個集合,並且如果要對創建的集合執行進一步操作比使用Union()方法創建的集合花費更長時間, Union()消除重複並使用較少的元素創建集合。

+0

好的。但如何將''T1'作爲UsageType'轉換爲linq查詢 – 2012-07-11 06:19:19

+0

@AliRızaAdıyahşi - 檢查我編輯的答案.... – 2012-07-11 06:22:21

+0

'unioun = union'和'concat = union all'是嗎? – 2012-07-11 06:33:44

1

爲了得到你可能想要做的事,如匿名類型預期的屬性名稱:

new { x.date, TotalUsage = x.total_usage_T1, UsageType="T1" } 

new { x.date, TotalUsage = x.total_usage_T2, UsageType="T2" } 
8

使用此:

var result = entity.TblSayacOkumalari 
        .Select(x => new 
        { 
         Date = x.date, 
         TotalUsage = x.total_usage_T1, 
         UsageType = "T1" 
        }) 
        .Union(entity.TblSayacOkumalari.Select(x => new 
        { 
         Date = x.date, 
         TotalUsage = x.total_usage_T2, 
         UsageType = "T2" 
        })); 
+0

+ 1.感謝您的答覆。 @Pranay Rana的答案是我的預期。 – 2012-07-11 06:32:44