【问题标题】:Query that uses the Aggregate extension method against DbContext针对 DbContext 使用聚合扩展方法的查询
【发布时间】:2012-10-12 15:55:06
【问题描述】:

我有一个MockDataStore,它返回一个List<Task>。然后我会使用Aggregate 扩展方法来查询该列表。所以我正在做一个 LINQ-to-Objects 查询,它可以很好地完成这项工作。现在我已经用继承 DbContext 类的类替换了我的模拟数据存储,相同的查询不再起作用,因为我不能使用具有主体的 lambda 表达式,因为它无法转换为表达式树。那么有没有办法绕过它并且仍然在 SQL 中完成聚合并避免在内存中进行聚合?以下是我的代码:

        //List<Task> tasks = MockDataStore.GetData()
        //    .Aggregate(new List<Task>(), (accumulator, treaty) => { accumulator.AddRange(treaty.Tasks); return accumulator; })
        //    .Where(x => x.AssignedTo.Equals(companyId) && x.StatusId == statusId).ToList();

        using (SCGREDbContext context = new SCGREDbContext())
        {
            List<Task> tasks = context.Treaties.Aggregate(new List<Task>(), (accumulator, treaty) => { accumulator.AddRange(treaty.Tasks); return accumulator; })
                                .Where(x => x.AssignedTo.Equals(companyId) && x.StatusId == statusId).ToList();
            return tasks;
        }

【问题讨论】:

    标签: .net linq entity-framework aggregate-functions expression-trees


    【解决方案1】:

    您究竟为什么使用Aggregate()?我认为您的Aggregate() 调用等同于对SelectMany() 的调用:

    context.Treaties.SelectMany(treaty => treaty.Tasks)
    

    【讨论】:

    • 太棒了!现在我终于明白SelectMany 的用途了:)
    猜你喜欢
    • 2015-03-12
    • 2013-05-04
    • 1970-01-01
    • 1970-01-01
    • 2011-10-02
    • 2011-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多