我正在尝试按列分组并计算其他列中真/假行的数量。
例如我们有一个实体类:
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/