【问题标题】:LINQ to SQL - Join, Group, and SumLINQ to SQL - 加入、分组和求和
【发布时间】:2013-07-18 17:55:47
【问题描述】:

我有以下按预期工作的 SQL:

SELECT  p.ACCT_ID AS [Acct], 
    a.ACCT_NAME AS [AcctName], 
    p.PD_NO AS [Period], 
    p.FY_CD AS [FY], 
    SUM(CUR_AMT) AS [CActual], 
    SUM(CUR_BUD_AMT) AS [CBudget], 
    SUM(YTD_AMT) AS [YActual], 
    SUM(YTD_BUD_AMT) as [YBudget] 
FROM BudgetTotals p 
INNER JOIN BudgetAccounts a 
    ON p.ACCT_ID = a.ACCT_ID WHERE p.ACCT_ID IN ('610','620','630','634','641','642','643','644','646','665','620','DFC','DFR','DGN','DTX') 
    AND FY_CD == "2013" 
    AND PD_NO == 12 
    AND POOL_NO == 23 
GROUP BY p.ACCT_ID, a.ACCT_NAME, p.PD_NO, p.FY_CD;

我正在尝试使用以下内容将上述内容转换为 Linq to Sql:

var query = from p in db.POOL_SIE_SUPPORTs
            join c in db.ACCTs on p.ACCT_ID equals c.ACCT_ID
            where arr.Contains(p.ACCT_ID) && p.POOL_NO == 23 && p.FY_CD == "2013" && p.PD_NO == 12
            group p by p.ACCT_ID into s
            select new
            {
                Account = s.Key,
                AccountName = from acct in db.ACCTs select new { acct.ACCT_NAME },
                CTDActual = string.Format("{0:C}", s.Sum(y => y.CUR_AMT)),
                CTDBudget = string.Format("{0:C}", s.Sum(y => y.CUR_BUD_AMT)),
                YTDActual = string.Format("{0:C}", s.Sum(y => y.YTD_AMT)),
                YTDBudget = string.Format("{0:C}", s.Sum(y => y.YTD_BUD_AMT))
           };

如何让我的查询返回 AccountName 列?

【问题讨论】:

  • 你不是已经这样做了吗?
  • 很遗憾没有。绑定到查询时,AccountName 列不会出现在网格视图上。
  • 但是您在查询中选择了它,最好向我们展示您的 gridview 代码?
  • 我认为问题是这里的查询,因为 AccountName 被分配了一个列表而不是单个项目。
  • 您需要使用 s.Key(Acct_id),只为 AccountName 选择您想要的单个名称。可能需要一个 .Single() 但我不记得如何在 linq 语法中做到这一点,因为我通常使用扩展方法。希望有人能证明这一点。

标签: c# .net linq linq-to-sql


【解决方案1】:

这假设每个给定的 Acct_Id 只有一个 Acct_Name,否则您将获得多条记录,就像您按以下方式进行分组时一样:

var query = from p in db.POOL_SIE_SUPPORTs
            join c in db.ACCTs on p.ACCT_ID equals c.ACCT_ID
            where arr.Contains(p.ACCT_ID) && p.POOL_NO == 23 && p.FY_CD == "2013" && p.PD_NO == 12
            group p by new { p.ACCT_ID, p.ACCT_NAME } into s
            select new
            {
                Account = s.Key.ACCT_ID,
                AccountName = s.Key.ACCT_NAME, 
                CTDActual = string.Format("{0:C}", s.Sum(y => y.CUR_AMT)),
                CTDBudget = string.Format("{0:C}", s.Sum(y => y.CUR_BUD_AMT)),
                YTDActual = string.Format("{0:C}", s.Sum(y => y.YTD_AMT)),
                YTDBudget = string.Format("{0:C}", s.Sum(y => y.YTD_BUD_AMT))
           };

【讨论】:

  • 杰出的亚伦!第二个选项做到了。非常感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-06-24
  • 2013-07-19
  • 2022-01-22
  • 2017-06-13
  • 1970-01-01
  • 1970-01-01
  • 2012-03-05
相关资源
最近更新 更多