У вас должно получиться просто сравнить две переменные:
e.CategoryId == categoryId
Если вы хотите, чтобы специальная обработка одного была NULL, возможно, потому что вы хотите, чтобы это был особый случай, когда NULL соответствует всему вместо просто еще одного NULL, вы можете добавить следующее:
e.CategoryId == categoryId || !e.CategoryId.HasValue || !categoryId.HasValue
Ваша проблема с вашим утверждением в том, что вы получаете доступ к .Value
.Да, если вы запустите код с Linq-To-Objects в памяти, он будет работать, потому что компилятор будет запускать код только одной ветви вашего оператора if (троичный оператор, я знаю, но вы понимаете, что я имею в виду),Но для базы данных необходимо подготовить заявление.Это утверждение должно быть в полном объеме, оно не использует короткое замыкание.Поэтому построитель операторов будет обращаться к обеим вашим веткам, чтобы построить этот оператор для базы данных, и одна из этих ветвей потерпит неудачу, потому что она обращается к .Value
, хотя ее нет.