c# - GroupBy 和 Count by condition Entity Framework

标签 c# linq entity-framework-core

我正在尝试按列分组并计算其他列中真/假行的数量。

例如我们有一个实体类:

public class Example {
    public int Id { get; set; }
    public int ParentId { get; set; }
    public string Type { get; set; }
    public bool Vote { get; set; }
}

我需要按 Type 分组,并计算 ParentId 为某个值的正确/错误投票数。我有什么:

await _dbContext.Example
    .Where(x => x.ParentId == parentid)
    .GroupBy(x => new { t.Type, t.Vote })
    .Select(x => new 
    {
        TrueVotes = x.Count(v => v.Vote == true),
        FalseVotes = x.Count(v => v.Vote == false),
        Type = x.Key.Type
    })
    .ToListAsync();

实体在运行此代码时抛出异常,表示无法将其转换为 SQL。问题出在 Count 调用上。

性能也需要考虑在内。

最佳答案

条件 Count SQL 转换在 EF6 中得不到很好的支持,直到现在在 EF Core 中也完全没有得到支持。

EF Core 5.0(目前处于预览阶段)终于添加了正确的翻译,因此示例代码无需修改即可运行。

在 EFC Core 5.0 之前,您可以使用等效的条件 Sum,即代替

Count(condition)

使用

Sum(condition ? 1 : 0)

在您的查询中

TrueVotes = x.Sum(v => v.Vote == true ? 1 : 0),
FalseVotes = x.Sum(v => v.Vote == false ? 1 : 0),

不相关,但您可能应该从分组键中排除Vote

//.GroupBy(x => new { t.Type, t.Vote })
.GroupBy(x => new { t.Type })

否则计数将始终为 0 和 1,反之亦然。

关于c# - GroupBy 和 Count by condition Entity Framework ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64079347/

相关文章:

c# - 返回 XDocument 深处的元素值

c# - 如何按键选择组合框中的项目?

c# 将字符串转换为单个

c# - 左侧对象不是一行中的空运算符

c# - 从 .NET 4.5 迁移到 .NET Core 2.2 后如何处理 "re-pluralize"数据库表?

c# - Entity Framework 核心: unhandled exception

c# - 了解 .NET Core 和 Entity Framework 的版本

c# - 是否可以从代码中生成卫星程序集?

c# - 在文本框中发生任何更改时立即更改按钮的启用状态?

c# - 如何使用 string.split 对具有特定格式的字符串列表进行排序?