【问题标题】:Linq union usage?Linq联合使用?
【发布时间】:2012-07-10 17:09:04
【问题描述】:

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

我很努力,但做不到。请帮忙。

【问题讨论】:

    标签: c# sql linq sql-to-linq-conversion


    【解决方案1】:

    编辑

    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() 方法通过消除重复返回可枚举集合,即,如果在执行联合的两个可枚举集合中存在相同元素,则仅返回单个元素。

    注意事项

    • 因此,我们可以说 Concat() 比 Union() 更快,因为它不进行任何处理。

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

    【讨论】:

    • 请注意不要对 Concat 与 Union 示例混淆 - 正如 Pranay Rana 所提到的,Union 使用默认的相等比较器。所以在他的例子中,使用整数,他的联合和连接导致不同的集合。如果您使用引用类型, object.Equals() 会检查 object.ReferenceEquals() 并且集合不一定不同。我并不是说他错了,只是在使用引用类型时需要注意一些微妙之处。
    【解决方案2】:

    使用这个:

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

    【讨论】:

      【解决方案3】:

      为了在匿名类型上获得预期的属性名称,您可能需要执行以下操作:

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

      还有

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-03-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多