NHibernate с LINQ, оператор "==" генерирует ИЛИ с "является нулем" - PullRequest
0 голосов
/ 26 сентября 2018

Когда я делаю этот запрос:

var query = from entity in session.Query<Entity>()
            where entity.Status != 2
            select entity;

NHibernate генерирует этот SQL:

SELECT ...
FROM TABLE_NAME ALIAS
WHERE ALIAS.SITFIL <> 2 
       or ALIAS.SITFIL is null /*this 'or' is the problem*/

Почему NHibernate делает это?

Редактировать : «или» вызывает проблему производительности в моем приложении

Я хочу сгенерировать только:

SELECT ...
FROM TABLE_NAME ALIAS
WHERE ALIAS.SITFIL <> 2 

Без 'Или полеis null '

Отображение не может иметь значение null:

[Property(Column = "SITFIL", NotNull = true)]
public virtual TypeEnumOfProperty Status { get; set; }

Перечисление:

public enum TypeEnumOfProperty
{
    [Display(Name = "Ativa", Description ="Ativo")]
    Ativa = 0,
    [Display(Name = "Inativa", Description = "Inativo")]
    Inativa = 1,
    [Display(Name = "Inativa e oculta", Description = "Inativo e oculto")]
    InativaOculta = 2,
}

Редактировать: Если я изменю свойство TypeEnumOfProperty наint SQL генерируется так, как я хочу, если изменение на TypeEnumOfProperty или long сгенерировано с помощью 'или'.

Если при сравнении я использую 'equals', NHibernate генерирует предложение where без 'или'.

Кто-нибудь знает, почему и как это решить?

Ответы [ 3 ]

0 голосов
/ 02 октября 2018

Это поведение по умолчанию.Это не ошибка как таковая, но ее можно улучшить.

Вы можете обойти эту проблему, выполнив следующее:

var query = from entity in session.Query<Entity>()
            where !(entity.Status == 2)
            select entity;

План выполнения будет идентичен тому, что выповторно стремиться к.Вы даже можете вставить пользовательский поставщик запросов, который автоматически переписывает все это для вас.

0 голосов
/ 07 октября 2018

Я думаю, что вы можете:

1) просмотреть эту статью , чтобы установить enum в файле отображения hbm.xml

     <property name="Status"  type="YourNamespace.Enums.TypeEnumOfProperty, YourNamespace.Enums"/>

2) использовать equals в linq влучше чем ==

0 голосов
/ 26 сентября 2018

Он выполняет то, что говорит ваш запрос, т.е.

var query = from entity in session.Query<Entity>()
        where entity.Status != 2
        select entity;

возвращает все, но не равно 2. Так что, если вам не нужен ноль, улучшите свой запрос.

var query = from entity in session.Query<Entity>()
            where entity.Status != 2 && entity.Status != null
            select entity;

всегда иди с более безопасной стороной, кто знает, что сломает твою логику.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...