Pergunta

Estou tentando criar uma extensão "WhereNot"

Então eu posso usar:

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

Observe que meu objetivo aqui é aprender expressões LINQ; não resolver meu problema.

Eu comi esta função:

 <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

Não sei como trocar a bandeira booleana, a função negará?

As respostas em vb.net e c# são solucionadas

Foi útil?

Solução

Sei que essa é uma pergunta muito antiga, mas acho que a resposta selecionada é enganosa, porque o Asker estava procurando uma expressão e a resposta selecionada fornece um Lambda.

Isso significa que sua invocação de um iQueryable retornará um IEnumerable<T>, não um IQueryable<T>. Isso força a expressão a compilar e pode levar a um acesso pouco otimizado aos provedores LINQ.

Aqui está uma resposta que aborda diretamente a pergunta 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());
    }
}

Outras dicas

Sim, um método Negate como esse o ajudará:

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 então use assim:

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

Ou com um método WhereNot () como este:

<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 em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top