Entity Framework Где параметры метода - PullRequest
0 голосов
/ 12 апреля 2011

Следующий оператор EF не компилируется, так как ожидает 2 дополнительных параметра, int и bool. Я не могу понять, как их поставлять или для чего они используются.

Dim L2 = Db.SecurityLogs.Where(Function(x) x.OrderId = OrderId)

Ошибка компиляции:

Error   27  Overload resolution failed because no accessible 'Where' can be called with these arguments:
'Public Function Where(predicate As String, ParamArray parameters() As System.Data.Objects.ObjectParameter) As System.Data.Objects.ObjectQuery(Of SecurityLog)': Lambda expression cannot be converted to 'String' because 'String' is not a delegate type.
Extension method 'Public Function Where(predicate As System.Func(Of SecurityLog, Integer, Boolean)) As System.Collections.Generic.IEnumerable(Of SecurityLog)' defined in 'System.Linq.Enumerable': Nested function does not have a signature that is compatible with delegate 'System.Func(Of SecurityLog, Integer, Boolean)'.
Extension method 'Public Function Where(predicate As System.Func(Of SecurityLog, Boolean)) As System.Collections.Generic.IEnumerable(Of SecurityLog)' defined in 'System.Linq.Enumerable': Option Strict On disallows implicit conversions from 'Boolean?' to 'Boolean'.
Extension method 'Public Function Where(predicate As System.Linq.Expressions.Expression(Of System.Func(Of SecurityLog, Integer, Boolean))) As System.Linq.IQueryable(Of SecurityLog)' defined in 'System.Linq.Queryable': Nested function does not have a signature that is compatible with delegate 'System.Func(Of SecurityLog, Integer, Boolean)'.
Extension method 'Public Function Where(predicate As System.Linq.Expressions.Expression(Of System.Func(Of SecurityLog, Boolean))) As System.Linq.IQueryable(Of SecurityLog)' defined in 'System.Linq.Queryable': Option Strict On disallows implicit conversions from 'Boolean?' to 'Boolean'.  D:\Projects\OutdoorAndCountry\trunk\Source\Server\DataModel\SecurityLogDb.vb    24  22  DataModel

Мне показалось, что я понял, как использовать метод Where, поэтому я должен вызывать его иначе, чем обычно, а MSDN, похоже, относится только к передаче функции без параметров.

Чего мне не хватает?

Заранее спасибо,

Ryan

1 Ответ

2 голосов
/ 12 апреля 2011

Я думаю, что последняя строка в сообщении об ошибке компилятора (которая представляет соответствующую перегрузку, которая должна быть применена) является важной подсказкой:

Метод расширения 'Открытая функция Где (предикат 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 или проекта, поскольку эта ошибка появляется, только если эта опция включена. (Но, возможно, могут быть и другие причины для включения этой опции в вашем проекте, поскольку она не является стандартной.)

...