При использовании Linq для чего-либо ответ зависит от реализации поставщика Linq и от того, как / если они решили обработать этот случай.
Когда вы пишете c => c.ParentCategoryId == id
, это дерево выражений.Поставщик Linq разбивает это на (1) доступ к свойству (ParentCategoryId
), (2) доступ к переменной (id
) и (3) он связывает два операнда вместе сравнением равенства (==
),Этот код на самом деле не работает как функция, он просто обрабатывается как выражение
Аналогично, c => Int32.Equals(c.ParentCategoryId, id)
разбивается на вызов метода (Int32.Equals
), который принимает два параметра.Поставщик Linq решил реализовать вызов на Int32.Equals
так же, как и ==
, тогда он должен быть идентичным.Тем не менее, более вероятно, что они не
Второй оператор Linq, вероятно, преобразуется в
select * from Categories where ParentCategoryId = NULL
, что никогда не было верно в ANSI SQL, поэтому вы каждый раз получаете 0 записей.Вам повезет, сказав .Where(x => x.ParentCategoryId != null)
или .Where(x => x.ParentCategoryId.HasValue)
.Опять же, это зависит от того, что выбрали создатели провайдера Linq, но один из них обязательно будет работать так, как вы ожидаете.