您可以实现自己的方法来制作必要的表达式树,如下所示:
public static IQueryable<TEntity> WhereNotIn<TEntity, TValue>(
this IQueryable<TEntity> queryable,
Expression<Func<TEntity, TValue>> valueSelector,
IEnumerable<TValue> values)
where TEntity : class
{
if (queryable == null)
throw new ArgumentNullException("queryable");
if (valueSelector == null)
throw new ArgumentNullException("valueSelector");
if (values == null)
throw new ArgumentNullException("values");
if (!values.Any())
return queryable.Where(e => true);
var parameterExpression = valueSelector.Parameters.Single();
var equals = from value in values
select Expression.NotEqual(valueSelector.Body, Expression.Constant(value, typeof (TValue)));
var body = equals.Aggregate(Expression.And);
return queryable.Where(Expression.Lambda<Func<TEntity, bool>>(body, parameterExpression));
}
}
现在你可以调用这个扩展方法了
var badGuys = new int[] { 100, 200, 300 };
context.Persons.WhereNotIn(p => p.PersionId, badGuys);
这个方法和下面的一样:
context.Persons.Where(p => p.PersonId != badGuys[0]
&& p.PersonId != badGuys[1]
. . .
&& p.PersonId != badGuys[N]);
对于badGuys 可枚举对象的每个元素。
该方法的另一个优点是它的通用性,因为您可以为任何实体的任何属性调用它,例如 f.e. context.Persons.WhereNotIn(p => p.LastName, new[] { "Smith", "Brown", "Jones" }).