linq to sql的多条件动态查询


首先 一个生成Lambda表达式的静态类
public static class PredicateExtensions
    {
        public static Expression<Func<T, bool>> True<T>() { return f => true; }

        public static Expression<Func<T, bool>> False<T>() { return f => false; }

        public static Expression<Func<T, bool>> Or<T>(this Expression<Func<T, bool>> expression1,
           Expression<Func<T, bool>> expression2)
        {
            var invokedExpression = Expression.Invoke(expression2, expression1.Parameters
                    .Cast<Expression>());

            return Expression.Lambda<Func<T, bool>>(Expression.Or(expression1.Body, invokedExpression),
            expression1.Parameters);
        }

        public static Expression<Func<T, bool>> And<T>(this Expression<Func<T, bool>> expression1,
              Expression<Func<T, bool>> expression2)
        {
            var invokedExpression = Expression.Invoke(expression2, expression1.Parameters
                 .Cast<Expression>());

            return Expression.Lambda<Func<T, bool>>(Expression.And(expression1.Body,
                   invokedExpression), expression1.Parameters);
        }
    }
有了这个就直接上了 下面一个调用的事例
Expression<Func<UsersProfile, bool>> WhereExpr =
                                PredicateExtensions.True<UsersProfile>();
            if (!string.IsNullOrEmpty(model.Address))
            {
                WhereExpr = WhereExpr.And(x => x.Address.Contains(model.Address));
            }
            if (!string.IsNullOrEmpty(model.CompanyName))
            {
                WhereExpr = WhereExpr.And(x => x.CompanyName.Contains(model.CompanyName));
            }
            if (!string.IsNullOrEmpty(model.LocationX))
            {
                WhereExpr = WhereExpr.And(x => x.LocationX.Contains(model.LocationX));
            }
            if (!string.IsNullOrEmpty(model.LocationY))
            {
                WhereExpr = WhereExpr.And(x => x.LocationY.Contains(model.LocationY));
            }
            if (!string.IsNullOrEmpty(model.Manager))
            {
                WhereExpr = WhereExpr.And(x => x.Manager.Contains(model.Manager));
            }
            if (!string.IsNullOrEmpty(model.NO))
            {
                WhereExpr = WhereExpr.And(x => x.NO.Contains(model.NO));
            }
            if (model.Type1 != null)
            {
                WhereExpr = WhereExpr.And(x => x.Type1 == (model.Type1));
            }
            if (model.Type2 != null)
            {
                WhereExpr = WhereExpr.And(x => x.Type2 == (model.Type2));
            }
            if (model.UserID != null)
            {
                WhereExpr = WhereExpr.And(x => x.UserID == (model.UserID));
            }
            var users = db.UsersProfile.Where(WhereExpr)
                .Skip((PageID.Value - 1) * PageCount).Take(PageCount);
最后 感谢网上的牛人写出的这个静态类!
posted @ 2010-11-03 17:11  liuwei0514  Views(1198)  Comments(1Edit  收藏  举报