2012-01-17 48 views
3

对不起,如果这已被问到,但是如何通过对数据库的单个调用来改进以下内容?使用单个查询的实体框架多次计数

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

至少'拒绝=总数 - 批准' – 2012-01-17 12:36:32

+0

我的意思是我可以轻松地返回所有消息并在那里过滤掉表单,但我可能会有数千条消息。返回整个表格将是一个强烈的查询,这就是为什么我只需要返回计数。 – TYRONEMICHAEL 2012-01-17 12:42:09

回答

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

与此相关的最后一个问题。它工作正常,但为每条消息返回{总计,接受}。所以我做的是“从_db.Messages 让m = _db.Messages.Count() 让Accept = _db.Messages.Count(x => x.Approved == true) select new {Total,Accept })FirstOrDefaul(); – TYRONEMICHAEL 2012-01-17 12:55:39

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();