【问题标题】:EF multiple aggregate in single query单个查询中的 EF 多个聚合
【发布时间】:2010-11-11 05:22:43
【问题描述】:

我想根据不同的条件获取一组的计数:

 var invoices = new AccountingEntities().Transactions
 var c1 = invoices.Count(i=>i.Type = 0);
 var c2 = invoices.Count(i=>i.Type = 1);
 var c3 = invoices.Count(i=>i.Type = 2);

如何在一次数据库往返中调用所有三个查询以提高性能?

【问题讨论】:

    标签: entity-framework aggregate


    【解决方案1】:

    当然,只需将您的三个计数包含在 POCO 或匿名类型中:

    using (var invoices = new AccountingEntities())
    {
        var c = (from i in invoices.Transactions
                 select new 
                 {
                     c1 = invoices.Count(i=>i.Type = 0),
                     c2 = invoices.Count(i=>i.Type = 1),
                     c3 = invoices.Count(i=>i.Type = 2)
                 }).Single();           
    }
    

    另外,像我展示的那样处理你的上下文。

    【讨论】:

    • 小心这个查询,如果你的集合是空的,Single() 会导致异常。使用FirstOrDefault 来防止这种情况发生。
    【解决方案2】:

    要聚合任意子查询,请使用一个虚拟单行结果集,从中嵌套所需的子查询。假设 db 代表您的 DbContext,计算发票类型的代码将如下所示:

    var counts = (
        from unused in db.Invoices
        select new {
            Count1 = db.Invoices.Count(i => i.Type == 0),
            Count2 = db.Invoices.Count(i => i.Type == 1),
            Count3 = db.Invoices.Count(i => i.Type == 2)
        }).First();
    

    如果想要一般地获取所有类型的计数,请使用分组:

    var counts =
        from i in db.Invoices
        group i by i.Type into g
        select new { Type = g.Key, Count = g.Count() };
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-05-27
      • 1970-01-01
      • 2018-06-28
      • 1970-01-01
      • 2021-05-14
      • 2018-10-13
      • 2011-05-24
      • 1970-01-01
      相关资源
      最近更新 更多