mvc entity framework 多条件 查询

mvc 多条件查询时,不想用拼接的方式,搜索了一圈,记录一下过程,最初采用 如下代码

     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);
            }
    }

使用如下:

 /// <summary>
        /// 获取用户列表 分页
        /// </summary>
        /// <param name="pageIndex">页码</param>
        /// <param name="pageSize">每页记录数</param>
        /// <param name="paras">查询参数</param>
        /// <returns></returns>
        public List<NewUser> GetUserList(int pageIndex, int pageSize, Dictionary<string,string> paras, out int totalcount)
        {
            totalcount=db.LsNewUsers.Count();
            int startRow=(pageIndex-1)*pageSize;
            return db.LsNewUsers.AsNoTracking().Where(GetExpression(paras).Compile()).OrderBy(u => u.UserId).Skip(startRow).Take(pageSize).ToList();
        }

        /// <summary>
        /// 获取查询条件 表达式树
        /// </summary>
        /// <param name="dicParam">参数列表</param>
        /// <returns></returns>
        public Expression<Func<NewUser, bool>> GetExpression(Dictionary<string,string> dicParam)
        {
            //个人理解,类似 赋给一个初始 条件 1=1 和 and方法一起用; 如果是false方法,类似赋给一个初始条件1!=1,和or方法一起用.
            Expression<Func<NewUser, bool>> searchPredicate = PredicateExtensions.True<NewUser>();
            foreach (string key in dicParam.Keys)
            {
                string condition = string.Empty;
                switch (key.ToLower())
                {
                    case "username": //case自己扩展
                        condition = dicParam[key];
                        searchPredicate = searchPredicate.And(c => c.UserName.IndexOf(condition)>-1);
                        break;
                  case "sex":
                        condition = dicParam[key];
                        bool blsex=true;
                        bool.TryParse(condition,out blsex);
                        searchPredicate = searchPredicate.And(c => c.Sex==blsex);
                        break;
                    default:
                        break;
                }
            }
            return searchPredicate;
        }


重点是这一句:

db.LsNewUsersWhere( condition.Compile()).OrderBy(u => u.UserId).Skip(startRow).Take(pageSize).ToList();

可以通过,但是 会出现 http://bbs.csdn.net/topics/390254489 中出现的问题,查询时,sql profiler 监视发现是查询全部表。

于是我去掉 complie方法,发现会出现 The LINQ expression node type 'Invoke' is not supported in LINQ to Entities 的错误


网上找了一圈。发现可以使LinqKit.dll 来解决这个entity framework中的这个问题

参考文章:http://www.albahari.com/nutshell/predicatebuilder.aspx

刚开始 百度搜了一个linqkit.dll,虽然方法有,但是错误依旧。。抱着试一试的态度,找到了上面文章中的linqkit的地址。下载下来,错误消失。

dll 下载地址:http://www.albahari.com/nutshell/LinqKit.zip

相关文章:http://www.albahari.com/nutshell/linqkit.aspx

怕国外的网站不行,自己也上传了一份,地址:http://download.csdn.net/detail/laokaizzz/7167477


因为我用的是 ef,所以得使用dll,又因为是。net 4.0 不是 4.5,不能直接从nuget里安装,所以直接引用的dll.


最终代码

使用如下:

   /// <summary>
        /// 获取用户列表 分页
        /// </summary>
        /// <param name="pageIndex">页码</param>
        /// <param name="pageSize">每页记录数</param>
        /// <param name="paras">查询参数</param>
        /// <returns></returns>
        public List<NewUser> GetUserList(int pageIndex, int pageSize, Dictionary<string,string> paras, out int totalcount)
        {
            int startRow=(pageIndex-1)*pageSize;
             Expression<Func<NewUser, bool>> condition=GetExpression(paras);

             totalcount = db.LsNewUsers.AsExpandable().Where(condition).Count();//获取总数 AsExpandable是linqkit.dll中的方法
             return db.LsNewUsers.AsExpandable().Where(condition).OrderBy(u => u.UserId).Skip(startRow).Take(pageSize).ToList();
        }

        /// <summary>
        /// 获取查询条件 表达式树
        /// </summary>
        /// <param name="dicParam">参数列表</param>
        /// <returns></returns>
        public Expression<Func<NewUser, bool>> GetExpression(Dictionary<string,string> dicParam)
        {
            //个人理解,类似 赋给一个初始 条件 1=1 和 and方法一起用; 如果是false方法,类似赋给一个初始条件1!=1,和or方法一起用.
            Expression<Func<NewUser, bool>> searchPredicate = PredicateBuilder.True<NewUser>();
            foreach (string key in dicParam.Keys)
            {
                string condition = string.Empty;
                switch (key.ToLower())
                {
                    case "username": //case自己扩展
                        condition = dicParam[key];
                        searchPredicate = searchPredicate.And(c => c.UserName.IndexOf(condition)>-1);
                        break;
                  case "sex":
                        condition = dicParam[key];
                        bool blsex=true;
                        bool.TryParse(condition,out blsex);
                        searchPredicate = searchPredicate.And(c => c.Sex==blsex);
                        break;
                    default:
                        break;
                }
            }
            return searchPredicate;
        }



  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值