Linq中动态Where子句的日期比较给出了过载异常

时间:2008-11-14 21:11:45

标签: vb.net linq-to-sql

我正在尝试在我的Linq to SQL查询中注入一个动态where子句,并且我得到一个重载异常。在查询中添加相同的表达式是否有效?

 qry.Where(Function(c) c.CallDate < Date.Now.AddDays(-1))

关于如何运作的任何想法?

例外情况如下:

Overload resolution failed because no accessible 'Where' can be called with these arguments:
Extension method 'Public Function Where(predicate As System.Func(Of Calls, Integer, Boolean)) As System.Collections.Generic.IEnumerable(Of Calls)' defined in 'System.Linq.Enumerable': Nested function does not have the same signature as delegate 'System.Func(Of Calls, Integer, Boolean)'.
Extension method 'Public Function Where(predicate As System.Func(Of Calls, Boolean)) As System.Collections.Generic.IEnumerable(Of Calls)' 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 Calls, Integer, Boolean))) As System.Linq.IQueryable(Of Calls)' defined in 'System.Linq.Queryable': Nested function does not have the same signature as delegate 'System.Func(Of Calls, Integer, Boolean)'.
Extension method 'Public Function Where(predicate As System.Linq.Expressions.Expression(Of System.Func(Of Calls, Boolean))) As System.Linq.IQueryable(Of Calls)' defined in 'System.Linq.Queryable': Option Strict On disallows implicit conversions from 'Boolean?' to 'Boolean'.  C:\Projects\Test Projects\Encore\EncoreData.vb  59  9   Encore

由于

2 个答案:

答案 0 :(得分:3)

刚刚在这里捅了一下,之前没见过,但是你走了。

看起来关键部分是这两行中的异常:

  

嵌套函数不一样   签名作为委托'System.Func(Of   Calls,Integer,Boolean)'。

     

禁止隐式转换   “布尔?到'布尔'。

所以你创建的函数似乎有一个boolean类型的输出? ,而where子句期望一个布尔值。并且系统不能从布尔值进行隐式转换?由于可能存在空值而导致布尔值。

因此,您可以尝试使用显式转换编写函数。 (布尔)或Convert.ToBool。

答案 1 :(得分:3)

我找到了答案......

c.Calldate是一个可以为空的类型,Date.Now不可为空。正确的表达应为:

qry.Where(Function(c) c.CallDate.Value > Date.Now.AddDays(-1))

例外中的提示是:

disallows implicit conversions from 'Boolean?' to 'Boolean'

注意“?”在第一个布尔值之后。

感谢您让我仔细查看错误消息!