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