Использование 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" }