实体框架,方法参数(Entity Framework Where method parameters

2019-10-31 10:00发布

因为它是希望2个额外的参数,一个int和一个布尔值以下EF语句不编译。 我无法弄清楚如何提供它们,或者他们正在使用的东西。

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似乎只指功能的传球不带参数的方式。

我在想什么?

提前致谢,

瑞安

Answer 1:

我觉得在编译器错误消息的最后一行(代表应适用有关的过载)是重要的暗示:

扩展方法 '公共功能位置(谓词作为System.Linq.Expressions.Expression(中System.Func(中SecurityLog,布尔值)))作为System.Linq.IQueryable(OF SecurityLog)' 在 'System.Linq.Queryable' 定义为:选项严格On不允许隐式转换从'布尔? 以“布尔”。

这表明,在表达式x.OrderId = OrderId任左侧(您的OrderId类SecurityLog的属性)是一个可空INT( Integer? )或右侧的类型是可空的INT。 的一个可为空的,并在为空的布尔非可空整数结果的比较( 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不存在则返回Y,否则返回x的值)

因为只有当该选项打开出现这个错误你也可以关闭该选项严明就在您的VB编译或项目设置。 (但可能有一些其他的原因,我想,有对你的项目这个选项,因为它是非默认值)。



文章来源: Entity Framework Where method parameters