2015-11-12 5 views
2

Допустим, у меня есть эта структура:Как создать анонимный тип с расчетными значениями

class Ticket 
{ 
int Id; 
bool Void; 
} 

Можно ли использовать LINQ, чтобы получить анонимный тип с этими двумя агрегированных свойствами?

select new {totalVoid = numVoidTickets, totalNonVoid = numNonVoidTickets}; 

Я думал, что это может быть подход:

from t in Tickets 
select new { totalVoid = t.Id.Count(x => x.Void == true, 
totalNonVoid = t.Id.Count(x => x.Void == false }; 

но IntelliSense не показывает Count() после того, как я печатаю t.Idt ни.

+4

'T' представляет идентификатор одного' Ticket' объект как же вы можете ожидать 'метод Count' там? –

ответ

2

Если вы хотите, чтобы минимизировать количество обращений к базе данных, вы можете использовать группировку для выполнения всех ваш агрегат за один звонок. Чтобы сгруппировать всю коллекцию, просто используйте GroupBy(t => 1).

var results = Tickets.GroupBy(t => 1).Select(t => new 
{ 
    totalVoid = t.Count(o => o.Void == true), 
    totalNonVoid = t.Count(o => o.Void == false) 
}); 
+1

Группировка константы творческая :) Но назад и не требуется. – usr

+1

@usr Это если вы хотите сделать это как один запрос вместо двух. – juharr

+1

Хм, это правда. Это единственный способ, с помощью которого ORM сделать это в одном запросе. +1 – usr

7

t - это отдельный элемент в вашем выражении.

Вам не нужен внешний Select/«от`, чтобы получить эту информацию:

var result = new 
{ 
    totalVoid = Tickets.Count(x => x.Void == true), 
    totalNonVoid = Tickets.Count(x => x.Void == false) 
}; 
1
List<Ticket> tickets = new List<Ticket>() 
{ 
    new Ticket{Id=10,Void =true}, 
    new Ticket{Id=10,Void =true}, 
    new Ticket{Id=10,Void =true}, 
    new Ticket{Id=10,Void =false}, 
    new Ticket{Id=10,Void =false}, 
    new Ticket{Id=10,Void =true}, 
    new Ticket{Id=10,Void =true}, 
}; 
var result = tickets.GroupBy(x => x.Void) 
    .Select(x=>new 
    { 
     typeVoid = x.Key, 
     coutVoid = x.Count() 
    }); 
foreach (var x in result) 
{ 
    Console.WriteLine("count = {0} type ={1}", x.coutVoid, x.typeVoid); 
} 
Смежные вопросы