zoukankan      html  css  js  c++  java
  • mvc entity framework 多条件 查询

     

    mvc entity framework 多条件 查询

    分类: mvc 170人阅读 评论(0) 收藏 举报

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

    [csharp] view plaincopy
    1.     public static class PredicateExtensions  
    2.        {  
    3.   
    4.            public static Expression<Func<T, bool>> True<T>() { return f => true; }  
    5.            public static Expression<Func<T, bool>> False<T>() { return f => false; }  
    6.   
    7.            public static Expression<Func<T, bool>> Or<T>(this Expression<Func<T, bool>> expression1, Expression<Func<T, bool>> expression2)  
    8.            {  
    9.                var invokedExpression = Expression.Invoke(expression2, expression1.Parameters.Cast<Expression>());  
    10.                return Expression.Lambda<Func<T, bool>>(Expression.Or(expression1.Body, invokedExpression), expression1.Parameters);  
    11.            }  
    12.            public static Expression<Func<T, bool>> And<T>(this Expression<Func<T, bool>> expression1, Expression<Func<T, bool>> expression2)  
    13.            {  
    14.                var invokedExpression = Expression.Invoke(expression2, expression1.Parameters.Cast<Expression>());  
    15.                return Expression.Lambda<Func<T, bool>>(Expression.And(expression1.Body, invokedExpression), expression1.Parameters);  
    16.            }  
    17.    }  
    18.   
    19. 用如下:  
    20.   
    21. /// <summary>  
    22.        /// 获取用户列表 分页  
    23.        /// </summary>  
    24.        /// <param name="pageIndex">页码</param>  
    25.        /// <param name="pageSize">每页记录数</param>  
    26.        /// <param name="paras">查询参数</param>  
    27.        /// <returns></returns>  
    28.        public List<NewUser> GetUserList(int pageIndex, int pageSize, Dictionary<string,string> paras, out int totalcount)  
    29.        {  
    30.            totalcount=db.LsNewUsers.Count();  
    31.            int startRow=(pageIndex-1)*pageSize;  
    32.            return db.LsNewUsers.AsNoTracking().Where(<span style="color:#ff0000;">GetExpression(paras).Compile</span>()).OrderBy(u => u.UserId).Skip(startRow).Take(pageSize).ToList();  
    33.        }  
    34.   
    35.        /// <summary>  
    36.        /// 获取查询条件 表达式树  
    37.        /// </summary>  
    38.        /// <param name="dicParam">参数列表</param>  
    39.        /// <returns></returns>  
    40.        public Expression<Func<NewUser, bool>> GetExpression(Dictionary<string,string> dicParam)  
    41.        {  
    42.            //个人理解,类似 赋给一个初始 条件 1=1 和 and方法一起用; 如果是false方法,类似赋给一个初始条件1!=1,和or方法一起用.  
    43.            Expression<Func<NewUser, bool>> searchPredicate = PredicateExtensions.True<NewUser>();  
    44.            foreach (string key in dicParam.Keys)  
    45.            {  
    46.                string condition = string.Empty;  
    47.                switch (key.ToLower())  
    48.                {  
    49.                    case "username"//case自己扩展  
    50.                        condition = dicParam[key];  
    51.                        searchPredicate = searchPredicate.And(c => c.UserName.IndexOf(condition)>-1);  
    52.                        break;  
    53.                  case "sex":  
    54.                        condition = dicParam[key];  
    55.                        bool blsex=true;  
    56.                        bool.TryParse(condition,out blsex);  
    57.                        searchPredicate = searchPredicate.And(c => c.Sex==blsex);  
    58.                        break;  
    59.                    default:  
    60.                        break;  
    61.                }  
    62.            }  
    63.            return searchPredicate;  
    64.        }  


    重点是这一句:

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

    转载来自于:http://blog.csdn.net/laokaizzz/article/details/23255367
  • 相关阅读:
    java并发ThreadLocal
    PermGen space 与 Java heap space
    java vm内存设置
    linux下ssh使用和配置
    ubuntu进入命令登录界面
    7-21 求前缀表达式的值
    7-20 表达式转换
    7-19 求链式线性表的倒数第K项
    7-18 银行业务队列简单模拟
    7-17 汉诺塔的非递归实现
  • 原文地址:https://www.cnblogs.com/wangyhua/p/4050522.html
Copyright © 2011-2022 走看看