`
sky00768
  • 浏览: 15068 次
  • 性别: Icon_minigender_1
  • 来自: 上海
最近访客 更多访客>>
社区版块
存档分类
最新评论

LINQ to Entity 中变通实现 IN 查询的方法

    博客分类:
  • LINQ
阅读更多
LINQ to SQL中,可以直接用Contains或Any来实现IN的查询,但是到了LINQ to Entity,用这种方式会直接提示系统不支持的错误,所以需要通过以下方式解决:
 
1、首先需要增加一个构建Lambda表达式的方法:
 
        /// <summary>
        /// 通过变通方法实现IN查询。
        /// </summary>
        /// <typeparam name="T">数据集合中的对象。</typeparam>
        /// <typeparam name="V">值类型。</typeparam>
        /// <param name="propertySelector">表达式。</param>
        /// <param name="values">值范围数组。</param>
        /// <returns>IN筛选表达式。</returns>
        private static Expression<Func<T, bool>> BuildWhereInExpression<T, V>(Expression<Func<T, V>> propertySelector, IEnumerable<V> 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(V))));
            var body = equals.Aggregate<Expression>((accumulate, equal) => Expression.Or(accumulate, equal));
 
            return Expression.Lambda<Func<T, bool>>(body, p);
        }
 
2、然后在代码中,通过如下方式进行过滤:
 
string[] ids = new string[] {"10101", "10005", "10007"};
var recordList = db.Profile.Where(BuildWhereInExpression<Profile, string>(l=>l.Id, ids);
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics