2

車両タイプ別にグループ化された車両をカウントする次のコードがあります。

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.

Sql サーバー CE のサブ クエリからの解決策は、列のエイリアスを指定し、order by 句でエイリアスを使用することです。

エラーを発生させずに実行できるようにするために使用している LINQ 式にエイリアスを提供する方法はありますか?

4

1 に答える 1

1

オブジェクトへの LINQ を使用して、メモリ内で 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();
于 2012-08-18T00:45:22.270 に答える