为什么NHibernate的LINQ提供程序为GroupBy()生成无效的T-SQL?

为什么NHibernate的LINQ提供程序为GroupBy()生成无效的T-SQL?,nhibernate,linq-to-nhibernate,Nhibernate,Linq To Nhibernate,我试图对每个制造商生产的产品数量进行简单的查询,但NHibernate并没有生成MS SQL Server认为有效的t-SQL 会话查询 .GroupByp=>p.制造商 .Selectgrp=>new{Mftr=grp.Key.Name,ProductCount=grp.Count} 托利斯特先生; 这看起来非常简单,但NHibernate生成的SQL语句没有包含所有必需的列名,因此在运行SQL Server 2008或SQL Server CE数据库时失败。如果我将相同的代码指向内存中的SQ

我试图对每个制造商生产的产品数量进行简单的查询,但NHibernate并没有生成MS SQL Server认为有效的t-SQL

会话查询 .GroupByp=>p.制造商 .Selectgrp=>new{Mftr=grp.Key.Name,ProductCount=grp.Count} 托利斯特先生; 这看起来非常简单,但NHibernate生成的SQL语句没有包含所有必需的列名,因此在运行SQL Server 2008或SQL Server CE数据库时失败。如果我将相同的代码指向内存中的SQLite数据库,它就可以正常工作

更多信息如下,我还创建了一个。如何解决此问题

生成的SQL 选择Manufacture1_uu2;.Id, castcount*作为INT, 制造商1_.Id, 制造商名称 来自产品0\u 左外连接制造商1\u 产品0上的制造商id=制造商1上的制造商id 按Manufacturer1.Id分组-Manufacturer1.Name在哪里? 实体 公共类产品{ 公共虚拟整数Id{get;set;} 公共虚拟字符串名称{get;set;} 公共虚拟制造商{get;set;} } 公共类制造商{ 公共虚拟整数Id{get;set;} 公共虚拟字符串名称{get;set;} } FNH映射 公共类ProductMap:ClassMap{ 公共产品地图{ Idx=>x.Id.GeneratedBy.HiLo1; Mapx=>x.Name; Referencesx=>x.Manufacturer.Cascade.SaveUpdate.Not.Nullable; } } 公共类制造商映射:类映射{ 公共制造地图{ Idx=>x.Id.GeneratedBy.HiLo1; Mapx=>x.Name; } }
这是一个查询版本

//alias variables
Manufacturer m = null;
ManufacturerProducts dto = null;

var result = Session.QueryOver<Product>
    .Left.JoinAlias(x => x.Manufacturer, () => m)
    .SelectList(list => list
        .SelectGroup(() => m.Id).WithAlias(() => dto.Id)
        .SelectGroup(() => m.Name).WithAlias(() => dto.Name)
        .SelectCount(x => x.Id).WithAlias(() => dto.ProductCount))
    .TransformUsing(Transformers.AliasToBean<ManufacturerProducts>())
    .List<ManufacturerProducts>();

可能是因为Linq提供者不是很好……你想在QueryOver中得到答案吗?@dotjoe:所以我开始学习了。我以前从未使用过QueryOver/ICriteria,所以使用该方法的答案会很有帮助。是的,我会在关键代码中远离NHLinq提供者。对于pet项目来说这很好,但它还没有达到LINQtoSQL甚至LINQtoEntities的级别。太糟糕了,因为NH在几乎所有其他方面都是最好的。