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

私は一生懸命努力しましたが、できませんでした。助けてください。

4

3 に答える 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"使用タイプについては、上記で行ったように、新しい匿名タイプを追加する必要があります。これにより、タスクが実行されます


Union メソッドではなく Concat メソッドを使用する必要があります..

 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() メソッドが 2 つの列挙可能なコレクションを 1 つのコレクションに結合するだけで、操作を実行せず、要素を処理せず、2 つの列挙可能なコレクションのすべての要素を含む単一の列挙可能なコレクションを返すことを示しています。

Union() メソッドは、重複を排除して列挙可能なコレクションを返します。つまり、ユニオンが実行される両方の列挙可能なコレクションに同じ要素が存在する場合は、単一の要素を返します。

重要な注意事項

  • この事実から、Concat() は処理を行わないため、Union() よりも高速であると言えます。

  • ただし、Concat() を使用して 2 つのコレクションを結合した後、重複要素の数が多すぎる単一のコレクションがあり、その作成されたコレクションに対してさらに操作を実行する場合、Union() メソッドを使用して作成されたコレクションよりも時間がかかります。要素の少ないコレクションを作成します。

于 2012-07-11T06:16:59.840 に答える
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"
                   })); 
于 2012-07-11T06:23:30.770 に答える
1

匿名型で期待されるプロパティ名を取得するには、おそらく次のようなことをしたいと思うでしょう:

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

そしてまた

new { x.date, TotalUsage = x.total_usage_T2, UsageType="T2" }
于 2012-07-11T06:21:25.610 に答える