1

У меня есть следующая проблема: у меня есть столбец с нулевым значением в моей таблице базы данных. Я хочу, чтобы добавить фильтр для него в предложение Where. Однако, когда столбец фактически равен нулю, я получаю сообщение об ошибке: «Ссылка на объект не установлена ​​в экземпляр объекта».Fluent NHibernate Querying: проверка значений нулевых столбцов

public class MyClass 
{ 
    public virtual float? Id { get; set; } 
} 

// When querying: 
... 
MyClass myClass = null; 
var query = GetCurrentSession().QueryOver<MyClass>(() => myClass); 

// The following all give the same null reference error. 
(1) query.Where(() => myClass.Id.ToString() == "..."); 
(2) query.Where(() => myClass.Id.Value.ToString() == "..."); 
(3) query.Where(() => myClass.Id != null && myClass.Id.ToString() == "..."); 
(4) query.Where(() => myClass.Id != null && myClass.Id.Value.ToString() == "..."); 
(5) query.Where(() => myClass.Id.HasValue && myClass.Id.ToString() == "..."); 
(6) query.Where(() => myClass.Id.HasValue && myClass.Id.Value.ToString() == "..."); 

Несколько похожая проблема можно найти here, но не помогло мне.

Похоже, что ленивая оценка внутри предложения Where не имеет места. У меня такое чувство, я пропускаю что-то очень очевидное здесь, но, похоже, не могу его найти.

ОБНОВЛЕНИЕ: Хорошо, поэтому, основываясь на предложении Новакова ниже, мне удалось исправить проблему сравнения с допустимым значением поплавка. Однако эта же проблема остается для (других) строковых значений. Например, я хочу иметь возможность сделать что-то подобное, и такое же исключение продолжает появляться, даже если я проверяю значение null в запросе.

query.WhereRestrictionOn(() => myClass.MyJoinedTable.MyField.ToLowerInvariant()).IsLike("%test%"); 
+1

Вы пробовали простые() => myClass.Id == 0,5 & le; Я уверен, что он должен работать – Novakov

ответ

1

С QueryOver синтаксиса (см 16. QueryOver Queries) должен выглядеть следующим образом:

I. обнуляемой собственностью

query.Where(() => myClass.Id == searchedValue) 

Не имеет значения, что свойство обнуляемое. Вышеприведенный оператор будет принимать только эти строки, которые имеют значение в БД и какое значение равно searchedValue

II. поиск для строки

MyJoinedTable myJoinedTable = null; 

query 
    ... 
    .JoinQueryOver<MyJoinedTable>(() => myClass.MyJoinedTable,() => myJoinedTable) 
    .WhereRestrictionOn(() => myJoined.Field) 
     .IsInsensitiveLike("test", MatchMode.Anywhere); 

Выше мы можем видеть, что мы, во-первых присоединиться к MyJoinedTable с помощью JoinQueryOver, а затем мы используем SQL LOWER() со встроенным методом NHiberante IsInsensitiveLike(")

Смежные вопросы