2017-02-02 3 views
2

Допустим, у меня есть следующая структура, переведенная с дискриминатором (таблица в иерархию):NHibernate Linq запрос, где (х => х базовый класс) не получает результирующие объекты

Entity (abstract, no discriminator) 
     | 
    Animal (abstract, no discriminator) 
    / \ 
Dog (1) Cat(2) 

Если я запрашиваю по этому с использованием Linq to NHibernate:

.Where(x => x.Entity is Animal) 

Результаты поиска не получены. При взгляде на сгенерированный запрос я ожидал увидеть:

where type in (1, 2) 

Но вместо этого я получил это:

where type='animal' 

Животное является абстрактным и даже не имеет дискриминатор, поэтому сгенерированный запрос не имеет смысла.

Копаем немного глубже Я обнаружил, что запрос переводится внутренне в нечто похожее на WHERE x.class=animal в HQL. Это ошибка в Linq для NHibernate? Или это ожидаемое поведение?

ответ

0

вы получите ожидаемый результат ли при использовании

session.Query<Animal>().Select(a => a.yourXEntity).ToList() 

Или

session.Query<Animal>().SelectMany(a => a.yourXEntityCollection).ToList() 

вместо? Те, кто должен обрабатывать полиморфизм.

В то время как ваш лямбда x.Entity is Animal получает весьма вероятно, переведен на HQLx.Entity.class = Animal, который не обрабатывает полиморфизм и принимает только значение дискриминатора указанного класса, который по умолчанию с именем класса.

+0

Если я выполняю 'session.Query .ToList()' Я получаю ожидаемый запрос, 'type in (1,2)'. Если я отвечу в вашем ответе, я думаю, что это тоже работает. Проблема заключается только в '.Where (x => x.Entity is Animal)'. Я мог бы сделать. Где (x => session.Query () .Выберите (a => a.Id) .Contains (x.Entity.Id)), но затем вместо простого 'where type in (1,2) 'Я получаю сложный подзапрос' where id in (select id from ...) '. – AlexDev

1

I исправлена ​​эта ошибка добавлена ​​эта функция в NHibernate. Изменения: here и могут быть построены из источника. Я выдал запрос на вытаскивание, поэтому, надеюсь, это будет работать в ближайшее время.

Обновление: Оно было merged и должно быть доступно в следующей версии.