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

Другие вопросы по тегам