Я думаю, что последняя строка в сообщении об ошибке компилятора (которая представляет соответствующую перегрузку, которая должна быть применена) является важной подсказкой:
Метод расширения 'Открытая функция
Где (предикат As
System.Linq.Expressions.Expression (Из
System.Func (Of SecurityLog, Boolean)))
Как System.Linq.IQueryable (Of
SecurityLog) 'определено в
'System.Linq.Queryable': строгий параметр
Запрещает неявные преобразования из
"Boolean? в логическое значение.
Это означает, что в вашем выражении x.OrderId = OrderId
либо левая сторона (свойство OrderId вашего класса SecurityLog) является обнуляемым int (Integer?
), либо тип с правой стороны - обнуляемым int. Сравнение целого числа, не допускающего значения NULL и NULL, приводит к получению значения Nullable Bool (Boolean?
). Компилятор жалуется, что не может преобразовать это Boolean?
в необнуляемое Boolean
, которое требует лямбда-выражение.
Чтобы решить эту проблему, вы можете преобразовать возможное значение Nothing
в обнуляемом типе в 0
(или другое целое число):
' If x.OrderId is the nullable Integer
Dim L2 = Db.SecurityLogs.Where(Function(x) If(x.OrderId, 0) = OrderId)
или
' If OrderId is the nullable Integer
Dim L2 = Db.SecurityLogs.Where(Function(x) x.OrderId = If(OrderId, 0))
(Если не уверен на 100% в синтаксисе VB, но If(x, y)
должно соответствовать здесь x ?? y
в C #, поэтому: если x равен Nothing, вернуть y, в противном случае вернуть значение x.)
Вы также можете отключить опцию Строгое вкл. в настройках компилятора VB или проекта, поскольку эта ошибка появляется, только если эта опция включена. (Но, возможно, могут быть и другие причины для включения этой опции в вашем проекте, поскольку она не является стандартной.)