【问题标题】:Performing a sum subquery using linq使用 linq 执行 sum 子查询
【发布时间】:2013-03-27 04:43:32
【问题描述】:

请有人协助解决以下问题。我正在尝试选择每个客户的所有收据的总和。但是我的选择部分中的“Total =”子查询不起作用,我收到以下错误:

无法创建“AppName.Domain.Entities.AccountingEntry”类型的常量值。此上下文仅支持原始类型或枚举类型。

我已经尝试在该查询之后执行 ToList() 但这会导致同样的问题。使用 linq 选择 Sum 作为子查询的标准方法是什么?

var receipts = (from ae in repo.AccountingEntries
                        join c in repo.Clients on ae.ClientId equals c.ClientId
                        join m in repo.Memberships on c.MembershipId equals m.MembershipId

                        where
                             (ae.EntryDate <= start) &&
                             (ae.ClientId != null) &&
                             (ae.AccountingEntryTypeId == (byte)Shared.AccountingEntryTypes.Receipt)


                        select new AppName.Reports.Clients.AgeAnalysis.Receipt
                        {
                            ClientId = (Guid)ae.ClientId,
                            Client = c.FirstName + " " + c.LastName,
                            Membership = c.Membership.Name,
                            Total = (from ae2 in repo.AccountingEntries where ae2.ClientId == ae.ClientId select ae2.Total).Sum()
                        });

谢谢, 加里

【问题讨论】:

  • Total是什么类型?
  • 查询不计算总数?
  • Total 是小数,是的,没有 Total 子查询部分,查询运行良好。

标签: linq entity-framework subquery


【解决方案1】:

这似乎过于复杂和不必要。如果您的实体模型设置正确,您可以通过删除连接并使用“group by”子句来简化。大致如下:

from ae in c.AccountingEntries    
where
    (ae.EntryDate <= start) &&
    (ae.ClientId != null ) &&
    (ae.AccountingEntryTypeId == (byte)Shared.AccountEntyrTypes.Receipt)
group by
    ae.Client into g
select 
    new AppName.Reports.Clients.AgeAnalysis.Receipt
    {
        ClientId = (Guid)g.Key.ClientId,
        Client = g.Key.FirstName + " " + g.Key.LastName,
        Membership = g.Key.Membership.Name,
        Total = g.Sum( p => p.Total )
    }

【讨论】:

  • 感谢 Moho,这一切都很好。我对 EF 很陌生,我什至没有意识到我可以通过一个实体本身来分组,这解决了我的整个问题。
猜你喜欢
  • 2018-07-31
  • 1970-01-01
  • 2012-08-28
  • 1970-01-01
  • 2011-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多