博客园  :: 首页  :: 联系 :: 管理

Lambda 表达式中使用 Contains (where in)

Posted on 2009-12-30 12:11  sunrack  阅读(3074)  评论(0)    收藏  举报
public static class QueryableExtension
    {
        private static Expression<Func<TElement, bool>> GetWhereInExpression<TElement, TValue>(Expression<Func<TElement, TValue>> propertySelector, IEnumerable<TValue> values)
        {
            ParameterExpression p = propertySelector.Parameters.Single();
            if (!values.Any())
                return e => false;
 
            var equals = values.Select(value => (Expression)Expression.Equal(propertySelector.Body, Expression.Constant(value, typeof(TValue))));
            var body = equals.Aggregate<Expression>((accumulate, equal) => Expression.Or(accumulate, equal));
 
            return Expression.Lambda<Func<TElement, bool>>(body, p);
        }
 
        /// <summary>  
        /// Return the element that the specified property's value is contained in the specifiec values  
        /// </summary>  
        /// <typeparam name="TElement">The type of the element.</typeparam>  
        /// <typeparam name="TValue">The type of the values.</typeparam>  
        /// <param name="source">The source.</param>  
        /// <param name="propertySelector">The property to be tested.</param>  
        /// <param name="values">The accepted values of the property.</param>  
        /// <returns>The accepted elements.</returns>  
        public static IQueryable<TElement> WhereIn<TElement, TValue>(this IQueryable<TElement> source, Expression<Func<TElement, TValue>> propertySelector, params TValue[] values)
        {
            return source.Where(GetWhereInExpression(propertySelector, values));
        }
 
        /// <summary>  
        /// Return the element that the specified property's value is contained in the specifiec values  
        /// </summary>  
        /// <typeparam name="TElement">The type of the element.</typeparam>  
        /// <typeparam name="TValue">The type of the values.</typeparam>  
        /// <param name="source">The source.</param>  
        /// <param name="propertySelector">The property to be tested.</param>  
        /// <param name="values">The accepted values of the property.</param>  
        /// <returns>The accepted elements.</returns>  
        public static IQueryable<TElement> WhereIn<TElement, TValue>(this IQueryable<TElement> source, Expression<Func<TElement, TValue>> propertySelector, IEnumerable<TValue> values)
        {
            return source.Where(GetWhereInExpression(propertySelector, values));
        }  
 
    }

 

使用方法

 

public List<Activity> Select(List<int> projectList, List<int> activityTypeList)
{  
var result = ObjectContext.Activity.
                WhereIn(it => it.Project.ProjectID, projectList).WhereIn(it => it.ActivityType.ActivityTypeID, activityTypeList);
 
    return result.ToList();
}