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

摘要:
前言我在使用查询时有几个疑问。我想使用ADO.NET替换EF查询。毕竟,EF是为了帮助您编写ADO.NET的操作框架。要调试查询代码,请使用sqlserver配置文件或sqlserver提供的直接ToTraceString()////query////<paramname=“xthere”˃////默认值为desc,0是desc,1是asc//<paramname=“pageIndex”˃第一页为0/<paramname=”pageSize“˃//<return>˂/return>publicIList<xt_ Product>GetList{//1。首先要查找的表//数据是IQueryable类型。其优点是,数据在ToList()或foreach之前不会加载到内存中。要实现“延迟执行”,可以添加许多条件,最后一个实现将加载数据。
前言(没废话的)

用查询时我有几个疑虑,搞得我都想用回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();
        }

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

免责声明:文章转载自《【.NET-EF】Entity Framework 学习笔记3:查询(模糊、排序、分页、多种条件)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇centos环境下安装FastDFS配置详解(包含配置nginx)mysql数据文件迁移到新的硬盘分区的方法下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

[转]EntityFramework Core技术线路(EF7已经更名为EF Core,并于2016年6月底发布)

本文转自:http://www.cnblogs.com/VolcanoCloud/p/5572408.html 官方文档英文地址:https://github.com/aspnet/EntityFramework/wiki/Roadmap 历经延期和更名,新版本的实体框架终于要和大家见面了,虽然还有点害羞。请大家多体谅! 下面正式进入主题: Entity...

EF core的原生SQL查询以及用EF core进行分页查询遇到的问题

在用.net core进行数据库访问,需要处理一些比较复杂的查询,就不得不用原生的SQL查询了,然而EF Core 和EF6 的原生sql查询存在很大的差异。 在EF6中我们用SqlQuery和ExecuteSqlCommand进行sql语句的执行,而在EF Core中我们则使用FromSql和ExecuteSqlCommand 一.ExecuteSqlC...

ASP.NET Core MVC中Hangfire及EF Core的简单使用

项目中可能要实现定时读写数据,所以了解了一下Hangfire,并简单尝试使用,同时又实践了一波EF Core的DB First模式 Hangfire 1.新建ASP.NET Core项目 2.Nuget安装Hangfire的包,因为我Hangfire配置用数据库使用的PostgreSql,所以添加的pg相关的引用,Hangfire官方支持SQL Serve...

Code First :使用Entity. Framework编程(4)

井底之蛙  博客园 首页 博问 闪存 新随笔 联系 订阅 管理 随笔- 35  文章- 0  评论- 2  Code First :使用Entity. Framework编程(4)  第4章 对关系使用默认规则与配置 在第3章,你已经掌握了默认规则与配置对属性以及其在数据库映射的字段的影响。在本章,我们把焦点放在类之间的关系上面。这包括类...

asp.net core系列 30 EF管理数据库架构--必备知识 迁移

一.管理数据库架构概述          EF Core 提供两种主要方法来保持 EF Core 模型和数据库架构同步。一是以 EF Core 模型为基准,二是以数据库为基准。            (1)如果希望以 EF Core 模型为准,请使用迁移。 对 EF Core 模型进行更改时,此方法会以增量方式将相应架构更改应用到数据库,以使数据库保持与...

EF Core 快速上手——EF Core 入门

EF Core 快速上手——EF Core 介绍 本章导航 从本书你能学到什么 对EF6.x 程序员的一些话 EF Core 概述 1.3.1 ORM框架的缺点 第一个EF Core应用   本文是对《Entity framework in action》部分章节的翻译,某些场景也会附上笔者实践的Demo。尽管很认真的斟酌,但是水平有限,还请各...