• 【.NET-EF】Entity Framework 学习笔记3:查询(模糊、排序、分页、多种条件)


    前言(没废话的)

    用查询时我有几个疑虑,搞得我都想用回ADO.NET来代替EF的查询,毕竟EF也就是帮你写好ADO.NET的操作框架。但还是先学了它再说吧。

    1.听说EF5.0以上的性能有所提高,具体怎样还没试过。

    2.EF要数据全部查出来再做分页,筛选,排序吗?  答:不用的,用linq是IQueryable类型,实现“延期执行”,意思就是可以把条件都加好了,一个ToList()再向内存加载数据,代码里有用到。

    3.监视EF生成的SQL语句。本来用了MiniProfiler(在工具 - NuGet管理器),但要2个插件,而且在EF6.0还会出错,要装个兼容的插件,要我这懒人就不想用了。要就用sql server自带的sql server profiler或者直接ToTraceString()来调试

    查询代码
    /// <summary>
            /// 查询(模糊、排序、分页、多种条件)
            /// </summary>
            /// <param name="xtwhere"></param>
            /// <param name="order"></param>
            /// <param name="sort">默认是desc,0是desc,1是asc</param>
            /// <param name="pageIndex">第一页是0</param>
            /// <param name="pageSize"></param>
            /// <returns></returns>
            public IList<xt_product> GetList(Dictionary<string,string> where,string order,int sort, int pageIndex, int pageSize)
            {
                //1.先要查什么表
                //data是IQueryable类型,好处是等到ToList(),或者foreach时才会向内存加载数据,实现“延期执行”,就是可以加很多条件,最后一句实现才加载数据。
                var data = from p in xtsql.xt_product
                           //orderby p.pid,p.createTime //排序可以写这里,可data的类型会变,我不想它变,也可以按下面的写
                           select p;
    
                //2.查询条件
                foreach (var w in where)
                {
                    if (w.Key == "title")//标题(模糊查询)
                    {
                        data = data.Where(p => p.title.IndexOf(w.Value) > 0);
                    }
                    if(w.Key=="prise")//价格(范围)
                    {
                        string[] prise2 = w.Value.Split(',');
                        data = data.Where(p => p.prise >= Convert.ToDecimal(prise2[0]));
                        data = data.Where(p => p.prise <= Convert.ToDecimal(prise2[1]));
                    }
                    if (w.Key == "createTime")//日期(范围)
                    {
                        string[] data2 = w.Value.Split(',');
                        data = data.Where(p => p.createTime > Convert.ToDateTime(data2[0]));
                        data = data.Where(p => p.createTime < Convert.ToDateTime(data2[1]));
                    }
                    if (w.Key == "type")//类型(子查询)
                    {
                        data = data.Where(p => xtsql.xt_rela_productType.Where(pt => pt.pid == Convert.ToInt32(w.Value)).Select(pt => pt.pid).Contains(p.pid));
                    }
                    if (w.Key == "state")//状态(多选)
                    {
                        string[] where_ary = w.Value.Split(',').ToArray();
                        data = data.Where(p => where_ary.Contains(p.state.ToString()));
                    }
                }
    
                //3.排序
                if(string.IsNullOrEmpty(order))
                {
                    if (sort == 1)
                    {
                        data.OrderBy(p => order).ThenByDescending(p => p.createTime);
                    }
                    else
                    {
                        data.OrderByDescending(p => order).ThenByDescending(p => p.createTime);
                    }
                }
                else
                {
                    data.OrderByDescending(p => p.createTime);//默认
                }             
                
                //data.OrderBy(p => p.pid).ThenBy(p => p.createTime);   OrderBy是升序,ThenBy是跟着的排序,下面的就是降序
    
                //4.分页 Skip是跳过多少行,Take是获取多少行
                data.Skip(pageSize * pageIndex);
                data.Take(pageSize);
    
                //5.最后才生成数据到内存
                return data.ToList();
            }
    调用存储过程(有点恶心)
    /// <summary>
            /// 执行存储过程
            /// </summary>
            /// <param name="table">表名</param>
            /// <param name="column">列名</param>
            /// <param name="where">条件</param>
            /// <returns>实体集</returns>
            public IList<xt_product> GetListByProc(string table, string column, string where)
            {
                SqlParameter[] param = {
                                            new SqlParameter("@table",table),
                                            new SqlParameter("@column",column),
                                            new SqlParameter("@where",where)
                                       };
                var list = this.xtsql.Database.SqlQuery<xt_product>("exec comm_select @table @column @where", param);
                return list.ToList();
            }

    注意:呃,还没测试,起码条件查询这样写不知道有没错,应该没错吧。

  • 相关阅读:
    Android_NDK问题:APP_BUILD_SCRIPT points to an unknown file: <project_path>/jni/Android.mk
    Android开发问题集锦-Button初始为disable状态时自定义的selector不生效问题
    一步步学习Python-django开发-添加后台管理
    一步步学习Python-django开发-建立django数据库
    一步步学习Python-django开发-Mac下搭建Python-Django环境
    JAVA小知识点-Finally和Return的执行关系
    Android自定义组合控件内子控件无法显示问题
    《将博客搬至CSDN》
    idea自动生成try/catch代码块的快捷键
    转:Apache common包 CollectionUtils 使用详解
  • 原文地址:https://www.cnblogs.com/laokchen/p/6289611.html
Copyright © 2020-2023  润新知