QueryOver завершается неудачно с не удалось разрешить свойство:
Я использую NHibernate 3.0 и сравнивал Query и QueryOver
var p = _prepo.Query<Party>()
.Where(c => c.Person.LastName == "Bobby")
.FirstOrDefault();
Выше работает, я получаю прокси-класс для p.Person, если я просматриваю граф объекта.
var p = _prepo.QueryOver<Party>()
.Where(c => c.Person.LastName == "Bobby")
.FirstOrDefault();
Этот сбой с ошибкой ==> не удалось разрешить свойство: Person.LastName из:
Зачем?
2 ответа
Я не знаком с провайдером Linq, но при использовании QueryOver
Вы должны использовать соединение, чтобы сделать запрос:
Пример 1
IQueryOver<Cat,Kitten> catQuery =
session.QueryOver<Cat>()
.JoinQueryOver(c => c.Kittens)
.Where(k => k.Name == "Tiddles");
Пример 2
Cat catAlias = null;
Kitten kittenAlias = null;
IQueryOver<Cat,Cat> catQuery =
session.QueryOver<Cat>(() => catAlias)
.JoinAlias(() => catAlias.Kittens, () => kittenAlias)
.Where(() => catAlias.Age > 5)
.And(() => kittenAlias.Name == "Tiddles");
Это работает, когда вы используете Linq в этом случае, потому что фильтрация выполняется на клиенте, а не в базе данных. Так что это на самом деле IEnumerable
версия, где это работает, которая не связана с NHibernate.
QueryOver использует Expression<Func<T,object>>
который NHibernate пытается перевести на SQL, но не удается. По неизвестным мне причинам вы должны явно присоединиться, используя JoinQueryOver или JoinAlias.
Еще немного информации о QueryOver здесь: http://nhibernate.info/blog/2009/12/17/queryover-in-nh-3-0.html