Хобрук: Ваш путь к мастерству в программировании

NHibernate Linq Query Where (x = ›x is Base Class) не получает производные объекты

Скажем, у меня есть следующая структура, сопоставленная с дискриминатором (таблица на иерархию):

    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'

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

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


Ответы:


1

Я исправил эту ошибку добавил эту функцию в NHibernate. Изменения находятся здесь и могут быть созданы из исходного кода. Я отправил пул-реквест, надеюсь, скоро он заработает.

Обновление: оно было объединено и должно быть доступно в следующем выпуске.

14.02.2017

2

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

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

Or

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

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

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

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

    Я собираюсь научить вас Python шаг за шагом
    Привет, уважаемый энтузиаст Python! 👋 Готовы погрузиться в мир Python? Сегодня я приготовил для вас кое-что интересное, что сделает ваше путешествие более приятным, чем шарик мороженого в..

    Альтернатива шаблону исходящих сообщений для архитектуры микросервисов
    Познакомьтесь с двухэтапным сообщением В этой статье предлагается альтернативный шаблон для папки Исходящие : двухэтапное сообщение. Он основан не на очереди сообщений, а на..

    React on Rails
    Основное приложение Reverb - это всеми любимый монолит Rails. Он отлично обслуживает наш API и уровень просмотра трафика. По мере роста мы добавляли больше интерактивных элементов..

    Что такое гибкие методологии разработки программного обеспечения
    Что представляют собой гибкие методологии разработки программного обеспечения в 2023 году Agile-методологии разработки программного обеспечения заключаются в следующем: И. Введение A...

    Ториго  — революция в игре Го
    Наш следующий вызов против ИИ и для ИИ. Сможет ли он победить людей в обновленной игре Го? Обратите внимание, что в следующей статье AI означает искусственный интеллект, а Goban  —..

    Простое развертывание моделей с помощью Mlflow — Упаковка классификатора обзоров продуктов NLP от HuggingFace
    Как сохранить свои модели машинного обучения в формате с открытым исходным кодом с помощью MLFlow, чтобы позже получить возможность легкого развертывания. Сегодня модели упаковки имеют несколько..

    Математика и интуиция - Часть 1
    У каждой математической формулы есть доказательство. Часто эти доказательства слишком сложно понять, поскольку многие из них основаны на индукции, некоторые - на очень сложных наблюдениях, а..