Почему поставщик LINQ NHibernate генерирует недопустимый T-SQL для GroupBy ()? - PullRequest
2 голосов
/ 19 августа 2011

Я пытаюсь сделать то, что кажется простым запросом для числа Products, создаваемого каждым Manufacturer, но NHibernate не генерирует T-SQL, который MS SQL Server находит действительным.

session.Query<Product>()
    .GroupBy(p => p.Manufacturer)
    .Select(grp => new {Mftr = grp.Key.Name, ProductCount = grp.Count()})
    .ToList();

Это кажется очень простым, но оператор SQL, который NHibernate генерирует , не включает в себя все необходимые имена столбцов , поэтому он не работает при работе с базой данных SQL Server 2008 или SQL Server CE. Если я указываю тот же код на базу данных SQLite в памяти, он работает нормально.

Дополнительная информация приведена ниже, и я также создал небольшое консольное приложение, которое демонстрирует мою проблему . Как мне исправить эту проблему?


Сгенерированный SQL

select manufactur1_.Id,
    cast(count(*) as INT), 
    manufactur1_.Id, 
    manufactur1_.Name 
from "Product" product0_ 
    left outer join "Manufacturer" manufactur1_ 
    on product0_.Manufacturer_id=manufactur1_.Id 
group by manufactur1_.Id   -- Where's manufactur1_.Name?

Сущность

public class Product {
    public virtual int Id { get; set; }
    public virtual string Name { get; set; }
    public virtual Manufacturer Manufacturer { get; set; }
}
public class Manufacturer {
    public virtual int Id { get; set; }
    public virtual string Name { get; set; }
}

FNH Mappings

public class ProductMap : ClassMap<Product> {
    public ProductMap() {
        Id(x => x.Id).GeneratedBy.HiLo("1");
        Map(x => x.Name);
        References(x => x.Manufacturer).Cascade.SaveUpdate().Not.Nullable();
    }
}

public class ManufacturerMap : ClassMap<Manufacturer> {
    public ManufacturerMap() {
        Id(x => x.Id) .GeneratedBy.HiLo("1");
        Map(x => x.Name);
    }
}

1 Ответ

2 голосов
/ 19 августа 2011

Вот версия QueryOver ...

//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>();
...