2017-02-23 144 views
1

Я просто понял, что, когда я прошу этоПочему Linq подстрока() игнорировать нулевое значение

Orders.Where(y => y.Sub_Item_Id.Substring(0, 10) != y.Sub_Item_Site_Id.Substring(0, 10)) 

Запрос игнорировать все мое нулевое значение, которое может существовать в y.Sub_Item_Site_Id. Поэтому, когда у меня есть значение в Sub_Item_Id и null в Sub_Item_Site_Id, запрос НЕ рассматривает это как !=.

Почему?


Я также протестировал тот же запрос с SQL

select 
    * 
from 
    orders as o 
where 
    LEFT(o.sub_item_id, 10) <> LEFT(o.sub_item_site_id, 10) 

И я получаю тот же результат. У меня все свое значение, но НЕ, когда у меня есть значение в o.sub_item_id и null в o.sub_item_site_id.

Не могли бы вы объяснить, как и почему SQL и Linq работают следующим образом.

ответ

1

Substring()не игнорировать нуль, в запросе, если одна из строк будет аннулирована, вы получите NullPointerException и если один из строки короче 10 символов, вы получите ArgumentOutOfRangeException:

https://msdn.microsoft.com/library/aka44szs(v=vs.110).aspx

Проверьте свои данные и ваш запрос.

+0

Извините, но если система генерирует excpetions, и это исключение являются дескриптором самой системы, результатом является то, что система игнорирует что-то. Да, ок. Таким образом, запрос Linq игнорирует эту строку, поскольку вы считаете, что система генерирует исключение. Так как насчет SQL-запроса? То же самое, LEFT() генерирует исключение? –

0

Реляционные выражения, содержащие NULL, на самом деле дают NULL снова. Чтобы фильтровать нулевые значения, вам необходимо использовать IS NULL и IS NOT NULL. Вы можете найти ответ here.

0

Возможно, вы захотите добавить тег, указывающий, что ваш LinQ в фоновом режиме подключается к базе данных для выполнения SQL там. Без этой информации Максим прав. В простых Linq-to-Objects C# вы получите соответствующие исключения.

Однако, поскольку ваш LinQ переведен и выполнен как SQL, вы просто встретили удивительно неинтуитивную функцию SQL: NULL никогда не равным ни к чему еще. Даже NULL. И NULL никогда не не равно что-нибудь еще. Нет даже значения или другого значения NULL. Это просто никогда дает true в сравнении, независимо от того, с чем вы сравниваете это.

Вы можете использовать синтаксис IS, чтобы узнать, что-то is NULL. Или вы можете заменить свой NULL значением по умолчанию перед выполнением вашего заявления. Но сравнение существующих значений и NULL всегда будет давать false, потому что NULL не равно никому, даже самому NULL.