【问题标题】:IQueryable LINQ ordering and groupingIQueryable LINQ 排序和分组
【发布时间】:2013-06-21 06:49:30
【问题描述】:

我有以下(不正确的)LINQ 函数(已更新):

public IQueryable<ClassUsageReport> GetClassUsage()
    {
        //Class Code, Title, Usage, FiscalYear
        var queryable = (from agencyplan in _agencyPlansList
                         join classSchedule2012 in _classSchedule2012List
                            on agencyplan.Id equals classSchedule2012.AgencyPlanId
                         join classes in _classesList
                            on classSchedule2012.Class.Id equals classes.Id
                         orderby agencyplan.PlanYear.FiscalYear descending, classes.ClassCode.Count() descending
                         group agencyplan by new
                         {
                             agencyplan.PlanYear.FiscalYear,
                             classes.ClassCode,
                             classes.Title 
                         } into gcs
                         select new ClassUsageReport
                         {
                             ClassCode = gcs.Key.ClassCode,
                             Title = gcs.Key.Title,
                             Usage = gcs.Key.ClassCode.Count(),
                             FiscalYear = gcs.Key.FiscalYear 
                         }
                        );

        return queryable.AsQueryable();
    }

我在使用 Group By 和 Order By 子句时遇到问题。也可以使用 COUNT()。

我编写了正确的 SQL 语句,可以根据需要(和预期)产生结果:

select py.fiscalyear, c.classcode, c.title, count(c.classcode) as usage from classschedule2012 cs
inner join classes c on cs.class_id = c.id
inner join agencyplans ap on cs.agencyplanid = ap.Id 
inner join planyears py on ap.planyear_id = py.id
group by py.fiscalyear, c.classcode, c.title
order by py.fiscalyear desc, usage desc

我的 LINQ 语句中的分组和排序有什么问题? 我希望它像我的 SQL 一样包含“使用情况”。我怎样才能让计数正确反映真实计数?由于目前的查询,它只在每一行中返回“9”。这与我的 SQL 不匹配,因为真正的结果应该是 "55, 44, 14, 13" 等等......

编辑:2013 年 11 月 14 日

这是最终结果:

   public IQueryable<ClassUsageReport> GetClassUsage()
   {
        //Class Code, Title, Usage, FiscalYear
        var queryable = (from agencyplan in _agencyPlansList
                         join classSchedule2012 in _classSchedule2012List
                            on agencyplan.Id equals classSchedule2012.AgencyPlanId
                         join classes in _classesList
                            on classSchedule2012.Class.Id equals classes.Id
                         where classes.Active = true
                         orderby agencyplan.PlanYear.FiscalYear descending
                         group agencyplan by new
                         {
                             agencyplan.PlanYear.FiscalYear,
                             classes.ClassCode,
                             classes.Title
                         } into gcs
                         select new ClassUsageReport
                         {
                             ClassCode = gcs.Key.ClassCode,
                             Title = gcs.Key.Title,
                             Usage = gcs.Count(),
                             FiscalYear = gcs.Key.FiscalYear
                         }
                        );

        return queryable.AsQueryable().OrderByDescending(x => x.FiscalYear).ThenByDescending(x => x.Usage);
    }

【问题讨论】:

    标签: sql linq list iqueryable


    【解决方案1】:

    尝试在 select 语句中使用 g.Key。

    【讨论】:

      【解决方案2】:

      分组后,您只能访问已分组的列并汇总其他列的数据(如 SUM 或 COUNT)。在查询的选择部分,您需要使用g. 而不是classes.

      【讨论】:

      • 所以基本上我需要进行多次查询才能实现这一点?
      • 不,您可以按多列分组,就像您的 SQL 查询一样。检查这个问题:stackoverflow.com/questions/5231845/…
      • 谢谢,帮助很大。我更新了我的问题。我几乎完成了 linq 查询,除了我不知道如何让 [usage] 字段正确使用 ClassCode 计数?我得到的只是每行中的“9”用于使用......关于在此查询中进行计数的任何线索?
      • usage 总是 9,因为那是字符串值的长度。如何计算(聚合)该字段并将其合并到此查询中?
      • 我相信正确的语法是gcs.Count(x=&gt;x.ClassCode)。试试看。
      猜你喜欢
      • 2011-05-01
      • 1970-01-01
      • 2016-05-24
      • 2010-11-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-11
      相关资源
      最近更新 更多