C# 实体框架使用单个查询进行多次计数
如果有人问这个问题,很抱歉,但是我如何通过一次对数据库的调用来改进以下内容C# 实体框架使用单个查询进行多次计数,c#,asp.net-mvc-3,entity-framework,entity-framework-4,C#,Asp.net Mvc 3,Entity Framework,Entity Framework 4,如果有人问这个问题,很抱歉,但是我如何通过一次对数据库的调用来改进以下内容 var statsModel = new { Total = _db.Messages.Count(), Approved = _db.Messages.Count(x => x.Approved), Rejected = _db.Messages.Count(x => !x.Approved), }; 首先,您可以按总计计算被拒绝的和接受的,如下所示: Rejected =
var statsModel = new
{
Total = _db.Messages.Count(),
Approved = _db.Messages.Count(x => x.Approved),
Rejected = _db.Messages.Count(x => !x.Approved),
};
首先,您可以按总计计算被拒绝的
和接受的,如下所示:
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})
更新:
现在有一个简单的技巧:坐第一排就行了
(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);
但是我在找一个更干净的这可能会有帮助:
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();
在C#(而不是LINQ查询)中,异步语法:
var statsModel = await _db.Messages
.GroupBy(m => 1, (g, mm) => new
{
Total = mm.Count(),
Approved = mm.Count(m => m.Approved),
Rejected = mm.Count(m => !m.Approved)
})
.SingleAsync();
至少Rejected=Total-Approved
我的意思是,我可以很容易地返回所有消息并过滤其中的表单,但我可能有数千条消息。返回整个表将是一个激烈的查询,这就是为什么我只需要返回计数。最后一个问题与此相关。它工作正常,但返回每条消息的{Total,Accept}。所以我所做的是“从m in _db.Messages让Total=_db.Messages.Count()让Accept=_db.Messages.Count(x=>x.Approved==true)选择new{Total,Accept}).FirstOrDefaul();