【问题标题】:Linq Group by with nested collection throwing Cannot perform an aggregate function带有嵌套集合抛出的 Linq Group by 无法执行聚合函数
【发布时间】:2022-01-12 14:40:54
【问题描述】:

我想做这样的事情:

        var projectHistory = await Context.Tasks.GroupBy(x => x.ProjectId).Select(x => new ProjectHistoryStatModel
        {
            ProjectId = x.Key,
            CompletedTasks = x.Where(y => y.StatusId == 4).Count(),
            InProgressTasks = x.Where(y => y.StatusId == 3).Count(),
            DelayedTasks = x.Where(y => y.EndDate < DateTime.Now && y.StatusId != 4).Count(),
            DependentTasks = x.Where(y => y.Dependents.Any()).Count(),
            TotalTasks = x.Count()
        }).ToListAsync();

但是 DependentTasks 属性 DependentTasks = x.Where(y =&gt; y.Dependents.Any()).Count(), 正在抛出:

无法对包含聚合或子查询的表达式执行聚合函数。

嗯 y.Dependents 是一个集合,这就是它抛出问题的原因,我也试过这个:DependetTasks = Context.TaskDependencies.Where(y =&gt; x.Any(z =&gt; z.Id == y.TaskId)).Count(), 并抛出同样的错误。

你们能告诉我在对数据库的同一个请求中这样做的方法吗?

问候

【问题讨论】:

  • 请说明您使用的是哪个ORM以及哪个版本。

标签: c# linq group-by collections


【解决方案1】:

假设您使用的是 EF Core

var query = 
    from t in Context.Tasks
    group new { t, HasDependents = t.Dependents.Any() } by t.ProjectId into g
    select new ProjectHistoryStatModel
    {
        ProjectId = g.Key,
        CompletedTasks = g.Where(y => y.t.StatusId == 4).Count(),
        InProgressTasks = g.Where(y => y.t.StatusId == 3).Count(),
        DelayedTasks = g.Where(y => y.t.EndDate < DateTime.Now && y.t.StatusId != 4).Count(),
        DependentTasks = g.Where(y => y.HasDependents).Count(),
        TotalTasks = g.Count()
    };

var projectHistory = await query.ToListAsync();

最高 6.0 的 EF Core 不支持在 GroupBy 之后翻译导航属性。

【讨论】:

    猜你喜欢
    • 2016-08-21
    • 1970-01-01
    • 2014-08-24
    • 2013-12-03
    • 2017-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多