前言(没废话的)
用查询时我有几个疑虑,搞得我都想用回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(); }
注意:呃,还没测试,起码条件查询这样写不知道有没错,应该没错吧。