2013-07-03 3 views
2

Никогда не использовали LINQ в C# до 30 минут назад, и я изо всех сил пытаюсь найти ответ на мой запрос в Интернете (возможно, из-за моего непонимания).LINQ и проверьте для! = Null

У меня есть простой запрос

var variableName = from a in tableName.AsEnumerable() 
    where a.column1 == item1 
     && a.column2 == item2 
     && a.column3 != null 
    select a; 

В столбце SQL определяется как INT, нуль.

Когда код встречает запись, которая является нулем в базе данных для column3, следующая ошибка генерируется «the value for column3 in table <tableName> is DBNull».

Вместо проверки != null, я думаю, я должен использовать что-то другое, но попытку проверки DBNull .Value но состояния компилятора «Operation != cannot be applied to operands of type int and system.DBNull».

Любые идеи?

+0

тип этой колонки в db? –

+0

Попробуйте изменить тип 'a.column3' на' Nullable int? ' – jAC

+0

что такое' tableName' и 'column3' здесь? это типизированный набор данных, например? или...? –

ответ

6

Этот выглядит как типизированный набор данных, который: yeuch - прекратить использовать те, но я отвлекся.

Таким образом, доступ к a.column3 всегда будет приводить к исключению, если это значение равно DBNull. Вам нужно будет использовать шаблон типизированного набора данных:

&& !c.Iscolumn3Null() 
+0

Да, похоже, это сработало. Я могу успешно получить нулевые, а не нулевые значения. Большое спасибо. – Giraffe

+0

@ Giraffe k, но, пожалуйста, для любви ко всему коду, пожалуйста, подумайте о том, чтобы отойти от типизированных наборов данных. Довольно пожалуйста. –

+0

@ Giraffe Я только что видел ваш комментарий к Marcin - действительно, если вы просто меняете одно, а затем уверены - поддерживаете существующую базу кода. Но когда вы делаете что-то новое, по крайней мере * считайте * используя другую технику; p –

0

tableName.AsEnumerable() делает запрос в памяти, поэтому все строки таблицы загружаются из БД и условия проверяются в приложении.

Попробуйте это:

var variableName = from a in tableName 
        where a.column1 == item1 
         && a.column2 == item2 
         && a.column3 != null 
        select a; 

Он должен быть переведен в запрос SQL и скачать только нужные строки.

+1

для меня этот «запрос» на самом деле выглядит как типизированный набор данных, и в этом случае это просто не применяется. –

+0

Да, это типизированный набор данных. Это также код, который уже находится в разделе «Производство», и это незначительное изменение, поэтому мне не разрешено вносить какие-либо изменения в таблицу SQL или изменять фундаментальную структуру, т. Е. Я должен использовать код LINQ, который уже присутствует, и просто добавить один для проверки! = null. – Giraffe

0

попробовать

var variableName = from a in tableName.AsEnumerable() 
    where a.column1 == item1 
     && a.column2 == item2 
     && !DBNull.Value.Equals(a.column3) 
    select a; 

редактировать, видимо, мне нужно прочитать на типизированных наборов данных :) и почему я никогда не должны использовать их

+1

, поскольку доступ к 'a.column3', кажется, вызвал эту ошибку, я действительно сомневаюсь, что это поможет –

+1

Я согласен с @MarcGravell – jAC

+0

Я только видел, что несоответствие типа вызывало проблему ... откуда мы знаем, что просто доступ к столбцу3 это ошибка? из документа: «Чтобы оценить поля базы данных, чтобы определить, являются ли их значения DBNull, вы можете передать значение поля методу DBNull.Value.Equals. Однако этот метод редко используется, поскольку существует ряд других способов оценки поле базы данных для отсутствия данных.К ним относятся функция Visual Basic IsDBNull, метод Convert.IsDBNull, метод DataTableReader.IsDBNull, метод IDataRecord.IsDBNull и несколько других методов. » – mckeejm

0

Попробуйте это ..

var variableName = from a in tableName.AsEnumerable() 
    where a.column1 == item1 
     && a.column2 == item2 
     && a.column3 != dbnull.value 
    select a; 
+0

, пожалуйста, см. Мой ответ mckeejm. Я сильно подозреваю, что эта ошибка происходит внутри элемента доступа' a.column3', поэтому не имеет значения *, что * мы сравниваем его to, так как он никогда не зайдет так далеко –

+0

Как указано в моем первом сообщении, это генерирует «Operation! = не может применяться к операндам типа int и system.DBNull». – Giraffe

+0

Я глубоко погружаюсь в этот сценарий. – user1812171

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