2013-03-26 61 views
0

請有人協助下面的查詢。我試圖選擇每個客戶端的所有收據總和。但是,我的select部分中的'Total ='子查詢不起作用,並且出現以下錯誤:使用linq執行求和子查詢

無法創建類型爲'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() 
         }); 

感謝, 加里

+0

什麼類型是Total? – 2013-03-26 13:28:11

+1

查詢沒有計算總數? – 2013-03-26 13:34:09

+0

Total是一個小數,是的,沒有Total子查詢部分查詢運行正常。 – Gary 2013-03-27 09:41:53

回答

2

這似乎過於複雜和不必要的。如果您的實體模型設置正確,則可以通過刪除連接並使用「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) 
    } 
+0

謝謝莫霍,這是完美的工作。我對EF很新,我甚至沒有意識到我可以通過實體本身來解決我的整個問題。 – Gary 2013-03-27 09:51:24