2008-11-14 9 views
4

J'essaie d'injecter une clause where dynamique dans ma requête Linq to SQL et j'obtiens une exception de surcharge. La même expression fonctionne quand elle est ajoutée dans la requête proprement dite?La comparaison de dates dans Dynamic Where Clause dans Linq donne l'exception de surcharge

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

Avez-vous des idées pour que cela fonctionne?

L'exception se lit comme suit:

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 

Merci

+0

Quel est le type de 'qry'? –

Répondre

3

juste de prendre un coup de poignard ici, ne l'ont pas vu cela avant, mais là, vous allez.

On dirait que les éléments clés sont ces 2 lignes de vous exception:

fonction n'a pas Nested ont la même signature en tant que délégué 'System.Func (de Appels, entiers, Boolean).

interdit les conversions implicites de 'Boolean?' à 'Boolean'.

Votre fonction que vous créez semble donc avoir une sortie de type boolean? , alors que la clause where attend un booléen. Et le système ne peut pas faire une conversion implicite à partir de booléen? à booléen en raison de la possibilité d'une valeur nulle. Par conséquent, vous pourriez essayer d'écrire votre fonction avec une conversion explicite. Soit (booléen) ou Convert.ToBool.

3

J'ai trouvé la réponse ...

c.Calldate est un type Nullable, Date.Now n'est pas annulable. L'expression correcte devrait lire:

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

L'indice à l'exception: "?"

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

Notez le après le premier booléen.

Merci de m'avoir fait regarder de plus près le message d'erreur!

Questions connexes