У меня есть запрос NHibernate LINQ, как это:Оптимизация NHibernate генерируется SQL
var maxNumber = session
.Linq<Child>()
.Where(c => c.Parent == parent)
.Max(c => c.Number);
NHibernate генерирует следующий SQL:
SELECT max(this_.Number)
FROM [Child] as this_
LEFT OUTER JOIN [Parent] parent1_
ON this_.Parent_id = parent1_.Id
WHERE parent1_.Id = @p0
Я хотел бы, чтобы это просто генерировать что-то вроде:
SELECT max(this_.Number)
FROM [Child] as this_
WHERE this_.Parent_id = @p0
Я бы ожидал, что планы выполнения будут одинаковыми для обоих запросов, но это не так. случай.
Мои объекты определяются следующим образом:
class Parent
{
long Id { get; set; }
string Name { get; set; }
}
class Child
{
long Id { get; set; }
int Number { get; set; }
Parent Parent { get; set; } // mapped as FK
}
С отображением, как это:
class ParentMap : ClassMap<Parent>
{
public ParentMap()
{
Id(x => x.Id).GeneratedBy.Increment();
Map(x => x.Name);
}
}
class ChildMap : ClassMap<Child>
{
public ChildMap()
{
Id(x => x.Id).GeneratedBy.Increment();
Map(x => x.Number);
References(x => x.Parent);
}
}
Как я мог бы переписать его, чтобы получить последний вывод, используя NHibernate? Это делается внутри метода репозитория, поэтому я могу легко переключиться на HQL или что-то еще, если это необходимо (или, конечно, простой DbCommand
, если все остальное не получится).
Я использую NHibernate 2.0 с LINQ-to-NHibernate и SQL Server 2008 R2.
Использование NH 3.2 Я получил оптимизированный запрос. Я предполагаю, что 2.0 просто не так умен в построении запроса. И из-за этого я не уверен, что HQL решит его. –