更新: EF≥4
Contains直接支持(Checkout
Any),因此您不需要任何解决方法。
public static IQueryable<TEntity> WhereIn<TEntity, TValue> ( this ObjectQuery<TEntity> query, expression<Func<TEntity, TValue>> selector, IEnumerable<TValue> collection ){ if (selector == null) throw new ArgumentNullException("selector"); if (collection == null) throw new ArgumentNullException("collection"); if (!collection.Any()) return query.Where(t => false); Parameterexpression p = selector.Parameters.Single(); IEnumerable<expression> equals = collection.Select(value => (expression)expression.Equal(selector.Body, expression.Constant(value, typeof(TValue)))); expression body = equals.Aggregate((accumulate, equal) => expression.Or(accumulate, equal)); return query.Where(expression.Lambda<Func<TEntity, bool>>(body, p));}//Optional - to allow static collection:public static IQueryable<TEntity> WhereIn<TEntity, TValue> ( this ObjectQuery<TEntity> query, expression<Func<TEntity, TValue>> selector, params TValue[] collection ){ return WhereIn(query, selector, (IEnumerable<TValue>)collection);}
用法:
public static void Main(){ using (MyObjectContext context = new MyObjectContext()) { //Using method 1 - collection provided as collection var contacts1 = context.Contacts.WhereIn(c => c.Name, GetContactNames()); //Using method 2 - collection provided statically var contacts2 = context.Contacts.WhereIn(c => c.Name, "Contact1", "Contact2", "Contact3", "Contact4" ); }}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)