【问题标题】:SqlCeException-Expressions in the ORDER BY list cannot contain aggregate functionsORDER BY 列表中的 SqlCeException-Expressions 不能包含聚合函数
【发布时间】:2012-08-17 21:42:28
【问题描述】:

我有以下代码,它计算按车辆类型分组的车辆。

using (var uow = new UnitOfWork(new NHibernateHelper().SessionFactory)) {
    var repo = new Repository<Vehicle>(uow.Session);
    var vtSummary= repo.ListAll()
                .GroupBy(v => v.VehicleType.Name)
                .Select(v => new NameCount { 
                         EntityDescription = v.First().VehicleType.Name,
                         QtyCount = v.Count() })
                .OrderByDescending(v => v.QtyCount).ToList();
     uow.Commit();
     return vtSummary;
}

上面产生如下sql代码:

SELECT VehicleType.Name as col_0_0_,
   CAST(COUNT(*) AS INT) as col_1_0_
FROM Vehicle vehicle0_
LEFT OUTER JOIN VehicleType vehicletype1_
  ON vehicle0_.VehicleTypeId= VehicleType.Id
GROUP  BY VehicleType.Name
ORDER  BY CAST(COUNT(*) AS INT) DESC

SQL 代码在 MS SQL Server 下运行良好,但在 SQl CE 下测试会产生以下错误:

System.Data.SqlServerCe.SqlCeException : Expressions in the ORDER BY list cannot contain aggregate functions.

Sub query in Sql server CE 的解决方案是为列指定别名并在 order by 子句中使用别名。

有没有什么方法可以在我使用的 LINQ 表达式中提供别名以使其运行而不会引发错误?

【问题讨论】:

    标签: sql-server linq nhibernate


    【解决方案1】:

    您可以使用 LINQ to objects 在内存中执行 OrderBy:

    var vtSummary= repo.ListAll()
                .GroupBy(v => v.VehicleType.Name)
                .Select(v => new NameCount { 
                         EntityDescription = v.First().VehicleType.Name,
                         QtyCount = v.Count() })
                .AsEnumerable() //SQL executes at this point
                .OrderByDescending(v => v.QtyCount).ToList();
    

    【讨论】:

    • 像魅力一样工作。非常感谢!
    猜你喜欢
    • 1970-01-01
    • 2022-01-14
    • 1970-01-01
    • 2018-06-12
    • 1970-01-01
    • 2017-06-22
    • 2018-12-21
    • 1970-01-01
    相关资源
    最近更新 更多