【.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();
        }

 

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

 

转载于:https://www.cnblogs.com/laokchen/p/6289611.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值