Не уверен, что происходит в BuildContainsExpression, но вот метод WhereNotIn, который я нашел где-то и использовал:
public static IQueryable<T> WhereNotIn<T, TValue>(
this IQueryable<T> query,
Expression<Func<T, TValue>> propertySelector,
IEnumerable<TValue> values)
{
if (propertySelector == null)
{
throw new ArgumentNullException("propertySelector");
}
if (values == null || !values.Any())
{
return query.Where(i => true);
}
var param = propertySelector.Parameters.Single();
var unequals = values.Select(value => (Expression)Expression.NotEqual(propertySelector.Body, Expression.Constant(value, typeof(TValue))));
var body = unequals.Aggregate<Expression>((accumulate, unequal) => Expression.And(accumulate, unequal));
var lambda = Expression.Lambda<Func<T, bool>>(body, param);
return query.Where(lambda);
}
Редактировать: как отмечено в комментариях, этот код должен быть помещен в статический класс для использования в качестве метода расширения.