0

Im пытается получить набор записей с использованием EF 4.3.1. Мне нужно получить все те записи, которые имеют значение NULL в определенном столбце.Где используется «IS NULL»

Я проверил базу данных, и многие строки имеют нуль в этой колонке, а также столбца с нулевым значением. EF делает что-то странное. Глядя на profiler, он генерирует следующий SQL:

SELECT 
CAST(NULL AS int) AS [C1] 
FROM (SELECT 1 AS X) AS [SingleRowTable1] 
WHERE 1 = 0 

Мои столбцы объекта объявлены как «int?».

Я попытался с помощью следующих conbinations, но я получаю тот же результат:

dbset.Where(e=>e.MyNullableInt == null).ToList(); 
dbset.Where(e=>e.MyNullableInt.Equals(null)).ToList(); 

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

Любые идеи, как достичь этого ?.

+0

UPDATE: Я нашел следующий билет в Codeplex относительно обнаруженной проблемы, которая затрагивает EF Версию предшествующего EF 5. http://entityframework.codeplex.com/workitem/178 Они предлагают использовать сравнение для обхода проблема, но в моем случае я не использую переменную, мне нужно фактически фильтровать, используя нуль. Кто-нибудь знает, как обходиться это? – Charles

+0

Вы уверены, что определили отображение как NULL? У вас есть атрибут [Обязательный] в поле объекта? –

+0

Да, фактически столбец является внешним ключом. Конфигурация объекта была выполнена с использованием свободного API. Я уже проверил, и в базе данных много строк с нулевыми значениями в этом столбце. Если вы получаете весь набор из EF, он возвращает null для тех строк, которые не имеют значений в этих столбцах, а id для тех строк, которые имеют. Проблема возникает, когда вы используете условие (x => x.id == null). Переход к последней версии EF сейчас не является вариантом, так как это потребует от меня проведения нескольких тестов во всем приложении. – Charles

ответ

1

Попробуйте Это может это может помочь U ...

dbset.Where(e=> (e.MyNullableInt ?? -1) == -1).ToList(); 
+0

Он частично работает. Если вы запустите dbset.Where (e => (e.MyNullableInt ?? -1) == -1) ... он ничего не получит. Если вы запустите dbset.Where (e => (e.MyNullableInt ?? -1)! = -1) ... он будет извлекать те строки, которые не равны -1. В терминах SQL, код выглядит так: WHERE (-1 = NullableInt) и ... WHERE (-1 <> NullableInt) Цените вашу помощь. – Charles

+0

В терминах SQL его как, где ISNULL (NullableInt, -1) = -1. Я использую его для извлечения данных для своего приложения, и это работает для меня. – Nowshath

+0

Возможно, вы используете другую версию EF. В моем API сгенерированный SQL очень отличается от следующего: WHERE (-1 = [Extent1]. [NullableInt]) " – Charles

0

Проверьте отображение, как я видел, что это происходит, когда в отображении вы каким-то образом делает это поле обязательно для заполнения.

или в вашей базе данных это поле не равно NULL.