Linq联合用法?

11

Sql:

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'作为UsageType转换为linq。同时,我的union使用也不正确。

我的表字段像这样:

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

我非常努力尝试过了,但是没成功。请帮忙。

3个回答

19

编辑

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

如果你想要使用类型,只需要像我上面所做的那样,在你的新匿名类型中加入UsageType = "T2",这样就可以完成任务了。


那么你应该使用Concat方法而不是Union方法。

示例:

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

输出

这里输入图片描述

关于Union和Concat的事实

输出显示,Concat()方法只是将两个可枚举集合组合成单个集合,但不执行任何操作/处理任何元素,只返回带有两个可枚举集合的所有元素的单个可枚举集合。

Union()方法通过消除重复来返回可枚举集合,即仅当相同的元素存在于执行Union的两个可枚举集合中时,它只返回单个元素。

需要注意的重要点

  • 根据这个事实,我们可以说Concat()比Union()更快,因为它不执行任何处理。

  • 但是,如果使用Concat()结合两个集合后,创建一个具有太多重复元素的单个集合,并且如果您想对创建的集合执行进一步操作,则需要比使用Union()方法创建的集合花费更长的时间,因为Union()消除重复并创建了元素较少的集合。


2
请注意不要被Concat vs Union的例子所迷惑 - 正如Pranay Rana所提到的,Union使用默认的相等比较器。因此,在他的例子中,使用整数,他的并集和连接产生了不同的集合。如果您使用引用类型,则object.Equals()检查object.ReferenceEquals(),集合不一定会不同。我不是说他错了,只是在使用引用类型时需要注意微妙之处。 - C B

9

使用这个:

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

1
为了在匿名类型中获得预期的属性名称,您可能想要执行以下操作:
new { x.date, TotalUsage = x.total_usage_T1, UsageType="T1" }

而且

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接