Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.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# GroupBy查询和位字段_C#_Entity Framework_Entity Framework Core - Fatal编程技术网

C# GroupBy查询和位字段

C# GroupBy查询和位字段,c#,entity-framework,entity-framework-core,C#,Entity Framework,Entity Framework Core,我使用的是EntityFrameworkCore2.1,我有一个数据库上下文,其中有一个模型的访问器,该模型包含一个布尔字段,在MS SQL数据库中表示为不可为空的位字段。我想构造一个在SQL中高效计算的查询,该查询为我提供表中所有行的计数,以及启用位列的行的计数 var groups = await this.context.Models .AsNoTracking() .GroupBy(i => 1) .Select(g => new ViewModel

我使用的是EntityFrameworkCore2.1,我有一个数据库上下文,其中有一个模型的访问器,该模型包含一个布尔字段,在MS SQL数据库中表示为不可为空的位字段。我想构造一个在SQL中高效计算的查询,该查询为我提供表中所有行的计数,以及启用位列的行的计数

var groups = await this.context.Models
    .AsNoTracking()
    .GroupBy(i => 1)
    .Select(g => new ViewModel
    {
        Count = g.Count(),
        Revoked = g.Count(p => p.IsRevoked)
    })
    .ToArrayAsync();
为了强制查询使用所有行,我使用ToArray,但是group by、count和where子句记录不能远程计算它们

其他尝试,例如:

var query = await this.context.Models
        .AsNoTracking()
        .GroupBy(i => i.IsRevoked)
        .ToArrayAsync();
生成两个组,我可以稍后检查它们,但它们无法对相同的位列求值

如何生成一个表达式来生成一个新对象,其中包含所有行的计数和启用位字段的子集的计数?

第一种技术(按常量分组)在EF6中运行良好。与基于谓词的
Count
没有直接的SQL等价物不同,使用条件
Sum
生成了一个漂亮的
GROUP BY
SQL

不幸的是,在EF Core中,即使在2.1中,这也不能转换为SQL

幸运的是,将其与中间投影相结合可以在EF 2.1中生成所需的SQL转换:

var counts = await this.context.Models
    .Select(e => new { Revoked = e.IsRevoked ? 1 : 0 })
    .GroupBy(e => 1)
    .Select(g => new ViewModel
    {
        Count = g.Count(),
        Revoked = g.Sum(e => e.Revoked)
    })
    .ToArrayAsync();