Использование Linq Union?

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 |

Я очень старался, но не смог. Пожалуйста помоги.

3 ответа

Решение

РЕДАКТИРОВАТЬ

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

Мое сообщение: Concat() против 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" в вашем новом анонимном типе, как я делал выше, это сделает задачу за вас


Чем вы должны пойти на метод 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);
 } 

выход

Факт про Союз и Конкат

Вывод показывает, что метод Concat() просто объединяет две перечислимые коллекции в одну, но не выполняет никаких операций / процессов, ни один элемент просто возвращает единственную перечисляемую коллекцию со всеми элементами двух перечислимых коллекций.

Метод Union() возвращает перечислимую коллекцию, удаляя дубликат, т.е. просто возвращает один элемент, если в обеих перечислимых коллекциях, в которых выполняется объединение, существует один и тот же элемент.

Важное замечание

  • По этому факту мы можем сказать, что Concat() быстрее, чем Union(), потому что он не выполняет никакой обработки.

  • Но если после объединения двух коллекций с использованием Concat(), имеющего одну коллекцию с слишком большим количеством повторяющихся элементов, и если вы хотите выполнить дальнейшую операцию с этой созданной коллекцией, потребуется больше времени, чем коллекции, созданной с помощью метода Union(), потому что Union() устраняет дубликат и создать коллекцию с меньшим количеством элементов.

Использовать этот:

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

Чтобы получить ожидаемые имена свойств для анонимного типа, вы, вероятно, хотите сделать что-то вроде:

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

а также

new { x.date, TotalUsage = x.total_usage_T2, UsageType="T2" }
Другие вопросы по тегам