Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/hadoop/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 实体框架使用单个查询进行多次计数_C#_Asp.net Mvc 3_Entity Framework_Entity Framework 4 - Fatal编程技术网

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