Я понимаю, что это очень старый ответ на вопрос, но я думаю, что выбранный ответ вводит в заблуждение, потому что спрашивающий искал выражение, а выбранный ответ дает лямбду.
Это означает, что его вызов из IQueryable вернет IEnumerable<T>
, а не IQueryable<T>
. Это заставляет выражение компилироваться и может привести к плохо оптимизированному доступу к поставщикам Linq.
Вот ответ, который напрямую касается исходного вопроса.
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());
}
}