Où pas l'expression LINQ
-
20-09-2019 - |
Question
Je suis en train de créer une extension "WhereNot"
Je peux donc utiliser:
Dim x = "Hello world "
Dim y = x.Split.WhereNot(AddressOf String.IsNullOrEmpty)
Notez que mon but ici est d'apprendre des expressions LINQ; pas résoudre mon problème.
Je craated cette fonction:
<Extension()> _
Public Function WhereNot(Of TElement)(ByVal source As IQueryable(Of TElement), ByVal selector As Expression(Of Func(Of TElement, Boolean))) As IQueryable(Of TElement)
Return source.Where(GetWhereNotExpression(selector))
End Function
Je ne sais pas comment changer le drapeau booléen, sera la fonction Négation faire?
réponses à la fois vb.net et C # sont welcommed
La solution
Je sais que c'est une question très ancienne réponse, mais je pense que la réponse choisie est trompeuse, parce que le demandeur cherchait une expression, et la réponse choisie fournit un lambda.
Cela signifie que son invocation d'un IQueryable retourne un IEnumerable<T>
, pas IQueryable<T>
. Cela force l'expression à compiler, et peut conduire à un accès mal optimisé aux fournisseurs Linq.
Voici une réponse qui aborde directement la question initiale.
public static class NegationExpressionHelper
{
public static IQueryable<T> WhereNot<T>(this IQueryable<T> queryable, Expression<Func<T,bool>> predicate)
{
return queryable.Where(predicate.Invert());
}
public static Expression<Func<T, bool>> Invert<T>(this Expression<Func<T, bool>> original)
{
return Expression.Lambda<Func<T, bool>>(Expression.Not(original.Body), original.Parameters.Single());
}
}
Autres conseils
Oui une méthode Négation comme cela vous aidera à:
Public Function Negate(Of T)(ByVal predicate As Func(Of T, Boolean)) As Func(Of T, Boolean)
Return Function(x) Not predicate(x)
End Function
Et puis utiliser comme ceci:
Dim x = "Hello world "
Dim y = x.Split.Where(Negate(Of String)(AddressOf String.IsNullOrEmpty))
Ou avec une méthode WhereNot () comme ceci:
<Extension> _
Public Shared Function WhereNot(Of T)(ByVal source As IEnumerable(Of T), ByVal predicate As Func(Of T, Boolean)) As IEnumerable(Of T)
Return source.Where(Negate(predicate))
End Function