Pregunta

Estoy tratando de crear una extensión "WhereNot"

Así que se puede usar:

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

Tenga en cuenta que mi objetivo aquí es aprender expresiones LINQ; no resuelve mi problema.

Me craated esta función:

 <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

No sé cómo cambiar la bandera booleana, hará el Negar la función que?

respuestas tanto en vb.net y C # se welcommed

¿Fue útil?

Solución

Me di cuenta que es una pregunta contestada muy antigua, pero creo que la respuesta seleccionada es engañosa, ya que el autor de la pregunta estaba buscando una expresión, y la respuesta seleccionada proporciona una lambda.

Esto significa que su invocación de un IQueryable devolverá un IEnumerable<T>, no un IQueryable<T>. Esto obliga a la expresión de recopilar, y puede conducir a mal acceso optimizado a los proveedores de Linq.

Esta es una respuesta que se dirige directamente a la pregunta original.

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

Otros consejos

Si un método Negar como esto le ayudará 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

Y a continuación, utilizar de esta manera:

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

O con un método WhereNot () así:

<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
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top