2012-01-17 2 views
3

Извините, если это было задано, но как я могу улучшить следующее с помощью одного вызова базы данных?Entity Framework несколько счетчиков с одним запросом

var statsModel = new 
{ 
    Total = _db.Messages.Count(), 
    Approved = _db.Messages.Count(x => x.Approved), 
    Rejected = _db.Messages.Count(x => !x.Approved), 
}; 
+0

по крайней мере 'Отклонено = Всего - Утверждено' –

+0

Я имею в виду, что я мог бы легко вернуть все сообщения и отфильтровать их там, но у меня могут быть тысячи сообщений. Возвращение всей таблицы было бы интенсивным запросом, и именно поэтому мне просто нужно вернуть счет. – TYRONEMICHAEL

ответ

4

Прежде всего, вы можете вычислить Rejected Тоталь и Принимается как это:

Rejected = Total - Approved 

И для дальнейшего улучшения вы можете вычислить их обоих в одном кадре;

from m in _db.Messages 
let Total = _db.Messages.Count() 
let Accept = _db.Messages.Count(x => x.Approved == true) 
select new {Total , Accept}) 

UPDATE: простой хак сейчас: просто взять первую строку

(from m in _db.Messages 
let Total = _db.Messages.Count() 
let Accept = _db.Messages.Count(x => x.Approved == true) 
select new {Total , Accept}).Take(1); 

Но я ищу уборщика один

+0

Последний вопрос, связанный с этим. Он работает правильно, но возвращает {Total, Accept} для каждого сообщения. Итак, что я сделал, это «from m in _db.Messages let Total = _db.Messages.Count() let Accept = _db.Messages.Count (x => x.Approved == true) select new {Total, Accept }) FirstOrDefaul(). – TYRONEMICHAEL

5

Это может помочь:

var statsModel =(
     from message in _db.Messages 
     group message by 1 into g 
     select new 
     { 
      Total = g.Count(), 
      Approved =g.Count (x =>x.Approved), 
      Rejected =g.Count (x =>!x.Approved) 
     } 
    ).FirstOrDefault(); 
Смежные вопросы