Хорошо, после использования отладчика, выясняется, что LINQ to SQL не понимает проверку нуля и просто выводит SQL следующим образом:
SELECT [t0]
FROM [dbo].[things] AS [t0]
WHERE [t0].[ID] = @p0
Поэтому, когда он решает значение @p0
он пытается оценить ID.Value
без учета моей нулевой проверки.
Я решил эту проблему с помощью GetValueOrDefault()
:
int? ID = null;
var query = from t in db.things where (!ID.HasValue || t.ID == ID.GetValueOrDefault()) select t;
В этом случае он может понятьпредложение where, поскольку переменная всегда будет иметь какое-либо значение.