NHibernate Linq выдает необъявленный запрос.Вот мои отображения классов:
public class OrderClassMap : ClassMap<Order> {
public OrderClassMap() {
Id(x => x.PersistenceId).Column("RowId").GeneratedBy.Assigned();
Version(x => x.PersistenceVersion).Column("RowVersion");
Map(x => x.OrderId).Generated.Insert().Not.Update();
Map(x => x.OrderDate);
References(x => x.Overseer).Column("OverseerId").PropertyRef(x => x.OverseerId);
References(x => x.Overseer2).Column("OverseerId2").PropertyRef(x => x.OverseerId2);
}
}
public class OverseerClassMap : ClassMap<Overseer> {
public OverseerClassMap() {
Id(x => x.PersistenceId).Column("RowId").Generated.Assigned();
Version(x => x.PersistenceVersion).Column("RowVersion");
Map(x => x.OverseerId).Generated.Insert().Not.Update();
Map(x => x.Name);
Map(x => x.Email);
}
}
Вот запрос Linq, который у меня есть:
var orders = session.Query<Order>()
.Where(o => ((o.Overseer.OverseerId == 1) || (o.Overseer.OverseerId == 2)))
.Fetch(o => o.Overseer)
.Fetch(o => o.Overseer2);
Сгенерированный SQL-запрос не тот, который я ожидал.Вместо того, чтобы делать левое внешнее соединение, оно делает декартово соединение.Вот сокращенный пример запроса, который производит NHibernate:
SELECT ...
FROM Orders o LEFT OUTER JOIN
Overseers v1 ON o.OverseerId = v1.OverseerId LEFT OUTER JOIN
Overseers v2 ON o.OverseerId2 = v1.OverseerId,
Overseers v3,
Overseers v4
WHERE o.OverseerId = v3.OverseerId AND
o.OverseerId2 = v4.OverseerId AND
(v3.OverseerId = 1 OR v4.OverseerId = 1)
Запрос, который я ожидал, будет выглядеть так:
SELECT ...
FROM Orders o LEFT OUTER JOIN
Overseers v1 ON o.OverseerId = v1.OverseerId LEFT OUTER JOIN
Overseers v2 ON o.OverseerId2 = v1.OverseerId
WHERE (v1.OverseerId = 1 OR v2.OverseerId = 1)
Я думаю, что это происходит потому, что у меня есть устаревшая база данныхЯ использую PropertyRef в моем отображении.Есть ли способ исправить это неожиданное поведение?Почему NHibernate ведет себя так?Это не имеет смысла для меня, потому что, указав PropertyRef, я говорю: «Используйте этот ключ вместо первичного ключа».