Domanda

Sto cercando di creare un'estensione "WhereNot"

Così posso usare:

Dim x = "Hello world "
Dim y = x.Split.WhereNot(AddressOf String.IsNullOrEmpty)

Si noti che il mio obiettivo è quello di imparare le espressioni LINQ; Non risolvere il mio problema.

I craated questa funzione:

 <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

Non so come passare il flag booleano, sarà la funzione Negate farlo?

risposte sia in vb.net e C # sono ospitava

È stato utile?

Soluzione

Mi rendo conto che questa è una vecchia questione ha risposto, ma credo che la risposta selezionata è fuorviante, perché il richiedente era alla ricerca di un'espressione, e la risposta selezionata riporta un lambda.

Ciò significa che la sua invocazione da un IQueryable restituirà un IEnumerable<T>, non un IQueryable<T>. Questo costringe l'espressione di compilare, e può portare a mal accesso ottimizzato per i fornitori di Linq.

Ecco una risposta che affronta direttamente la domanda iniziale.

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());
    }
}

Altri suggerimenti

Si Nega un metodo come questo vi aiuterà a:

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

E poi usare in questo modo:

Dim x = "Hello world "
Dim y = x.Split.Where(Negate(Of String)(AddressOf String.IsNullOrEmpty))

o con un metodo di WhereNot () in questo modo:

<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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top