gpt4 book ai didi

c# - GroupBy 查询和位字段

转载 作者:行者123 更新时间:2023-11-30 23:01:40 25 4
gpt4 key购买 nike

我正在使用 Entity Framework 核心 2.1,我有一个数据库上下文,其中包含一个 bool 字段的模型访问器,该字段表示为 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 中运行良好。只是使用条件 Sum 代替没有直接等效 SQL 的基于谓词的 Count 产生了一个很好的 GROUP BY SQL。

不幸的是,即使在 2.1 中,这也不会转换为 EF Core 中的 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();

关于c# - GroupBy 查询和位字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50916302/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com