Loading

Entity Framework 学习系列(5) - EF 相关查询

写在前面


  • IEnumberableIQueryable的区别?

    • IEnumberable类在调用SkipTake等拓展方法前数据已经加载再本地内存中。

    • IQueryable是将SkipTake这些方法表达式翻译成T-SQL语句之后再向SQL服务器发送命令的,也就是延迟加载在要真正显示数据的时候才执行。

  • 那什么时候使用IQueryableIEnumberable

    • 在数据访问层中使用IQueryable,因为可以把对数据加载延迟到业务逻辑层中处理。

    • 很多时候,业务层调用数据访问层的方法并不要求马上从数据库中加载数据再到内存中。

    • 如果在业务层需要使用延迟加载时,我们可以在业务层把IQueryable转换成IEnumberable把数据加载出来。

注意:其中 ToList()FirstOrDefault()InClude()方法可以禁止延迟加载。

一、使用Stopwatch 查询执行效率


在声明Stopwatch() 对象需要引用using System.Diagnostics;

//1.声明对象
Stopwatch st=new Stopwatch();
//2.开始
st.Start();
//
//3.执行代码
//

//4.结束
st.Stop();
//5.输出
Console.WriteLine("用时:{0}毫秒", st.ElapsedMilliseconds);

二、简单查询


1.Linq写法:

static void SipleQuery_Linq()
{
    //依赖上下文对象
    using(DatabaseContext _db=new DatabaseContext())
    {
        //声明Stopwatch对象
        Stopwatch st=new Stopwatch();
        //执行开始
        st.Start();
        //Linq 简单查询
        //语法格式:from 变量 in 实体 select 变量;
        var result=from q  in _db.shippers
                   select q;
        //输出结果
        foreach(var item in result)
        {
            Console.WriteLine("供应商编号:" + item.ShipperId);
            Console.WriteLine("供应商名称:" + item.CompanyName);
            Console.WriteLine("联系电话:" + item.Phone);
            Console.WriteLine("---------------------------------");
        }
        //执行结束
        st.Stop();
        Console.WriteLine("用时:{0}毫秒", st.ElapsedMilliseconds);
        Console.ReadKey();
    }
}

2.Lambda表达式写法:

static void SipleQuery_lambda()
{
    //上下文依赖
    using(DatabaseContext _db=new DatabaseContext())
    {
        //声明Stopwatch
        Stopwacth st=new Stopwatch();
        //执行开始
        st.Start();
        //Lambda 写法
        var result =_db.shippers.ToList();
        //输出结果
        foreach(var item in result)
        {
            Console.WriteLine("供应商编号:" + item.ShipperId);
            Console.WriteLine("供应商名称:" + item.CompanyName);
            Console.WriteLine("联系电话:" + item.Phone);
            Console.WriteLine("---------------------------------");
        }
        //执行结束
        st.Stop();
        Console.WriteLine("用时:{0}毫秒", st.ElapsedMilliseconds);
        Console.ReadKey();
    }
}

三、条件查询


1.Linq 写法

static void WhereQuery_Linq()
{   
    //声明上下文依赖
    using(DatabaseContext _db=new DatabaseContext())
    {
        //声明对象 需要引用 using System.Diagnostics;
        Stopwatch st=new Stopwatch();
        //执行开始
        st.Start();
        //linq 写法
        var result=from q in _db.shippers
                   where q.ShipperId==1
                   select q;
        //输出
        foreach (var item in result)
        {
            Console.WriteLine("供应商编号:" + item.ShipperId);
            Console.WriteLine("供应商名称:" + item.CompanyName);
            Console.WriteLine("联系电话:" + item.Phone);
            Console.WriteLine("---------------------------------");
        }
        //执行结束
        st.Stop();
        Console.WriteLine("用时:{0}毫秒", st.ElapsedMilliseconds);
        Console.ReadKey();
    }
}

2.lambda 写法

static void WhereQuery_lambda()
{
    //上下文依赖对象
    using(DatabaseContext _db=new DatabaseContext())
    {
        //声明Stopwatch
        Stopwatch st=new Stopwatch();
        //执行开始
        st.Start();
        //lambda表达式
        var result=_db.shippers.Where<Shippers>(q=>q.ShipperId==1);
        //输出结果
        foreach (var item in result)
        {
            Console.WriteLine("供应商编号:" + item.ShipperId);
            Console.WriteLine("供应商名称:" + item.CompanyName);
            Console.WriteLine("联系电话:" + item.Phone);
            Console.WriteLine("---------------------------------");
        }
        //执行结束
        st.Stop();
        Console.WriteLine("用时:{0}毫秒", st.ElapsedMilliseconds);
        Console.ReadKey();
    }
}

四、聚合函数


1.Linq 写法

static void Query_Linq()
{
    //上下文依赖
    using(DatabaseContext _db = new DatabaseContext())
    {
        //声明Stopwatch对象
        Stopwatch st = new Stopwatch();
        //执行开始
        st.Start();
        var linq_result_count = (from c in _db.shippers select c).Count();
        var linq_result_max = (from x in _db.shippers select x).Max(x => x.ShipperId);
        var linq_result_min = (from x in _db.shippers select x).Min(c => c.ShipperId);
        //执行结束
        st.Stop();
        //输出
        Console.WriteLine("总记录条数:", linq_result_count);
        Console.WriteLine("主键最大值:", linq_result_max);
        Console.WriteLine("主键最小值:", linq_result_min);
        Console.WriteLine("用时:{0}毫秒", st.ElapsedMilliseconds);
        Console.ReadKey();
    }
}

2.Lambda 写法

static void Query_Lambda()
{
    //声明上下文
    using(DatabaseContext _db = new DatabaseContext())
    {
        //声明Stopwatch
        Stopwatch st = new Stopwatch();
        //执行开始
        st.Start();
        var result_count = _db.shippers.Count();
        var result_max = _db.shippers.Max(c => c.ShipperId);
        var result_min = _db.shippers.Min(c => c.ShipperId);
        //执行结束
        st.Stop();
        //输出
        Console.WriteLine("总记录条数:", linq_result_count);
        Console.WriteLine("主键最大值:", linq_result_max);
        Console.WriteLine("主键最小值:", linq_result_min);
        Console.WriteLine("用时:{0}毫秒", st.ElapsedMilliseconds);
        Console.ReadKey();
    }
}

五、内连接


1.Linq 写法

  • 语法格式:(自己总结,不喜勿喷)
from 变量1 in 实体对象1
Join 变量2 in 实体对象2
on 变量1.字段 equals on 变量2.字段
select new{ 重新查询的字段 };

  • 具体实例
static void JoinQuery_Linq()
{
    //上下文依赖
    using(DatabaseContext _db=new DatabaseContext())
    {
        //声明Stopwatch
        Stopwatch st=new Stopwatch();
        //执行开始
        st.Start();
        var result=from a in _db.productus
                   join b in _db.shippers 
                   on a.SupplierId equals b.ShipperId
                   select new {
                        a.ProductId,
                        a.ProductName,
                        b.CompanyName
                   };
        foreach (var item in result)
        {
            Console.WriteLine("产品编号:" + item.ProductId);
            Console.WriteLine("产品名称:" + item.ProductName);
            Console.WriteLine("供应商名称:" + item.CompanyName);
            Console.WriteLine("---------------------------------");
        }
        //执行结束
        st.Stop();
        Console.WriteLine("用时:{0}毫秒", st.ElapsedMilliseconds);
        Console.ReadKey();
    }
}

2.Lambda Join写法

  • 语法格式:(自己总结,不喜勿喷)
上下文对象.实体对象1.Join(实体对象2,
实体对象1 lambda 表达式,
实体对象2 lambda 表达式,
(实体1变量,实体2变量)=>new {需要查询的字段});

  • 具体实例
static void JoinQuery_Lambda()
{
    //上下文依赖
    using(DatabaseContext _db=new DatabaseContext())
    {
        //声明Stopwatch
        Stopwatch st=new Stopwatch();
        //执行开始
        st.Start();
        var result=_db.productus.Join(_db.shippers, p => p.SupplierId, s => s.ShipperId,  (p, s) => new {
            p.ProductId,
            p.ProductName,
            s.CompanyName
        });
        
        foreach (var item in result)
        {
            Console.WriteLine("产品编号:" + item.ProductId);
            Console.WriteLine("产品名称:" + item.ProductName);
            Console.WriteLine("供应商名称:" + item.CompanyName);
            Console.WriteLine("---------------------------------");
        }
        //执行结束
        st.Stop();
        Console.WriteLine("用时:{0}毫秒", st.ElapsedMilliseconds);
        Console.ReadKey();
    }
}

六、左外部连接


1.Linq 写法

左外部联接,它返回第一个集合中的所有元素,无论它是否在第二个集合中有相关元素。

在 LINQ 中,通过对分组联接的结果调用 DefaultIfEmpty()方法来执行左外部联接。

DefaultIfEmpty()方法从列表中获取指定元素。如果列表为空,则返回默认值。

static void LeftJoinQuery()
{
    //依赖上下文对象
    using(DatabaseContext _db=new DatabaseContext())
    {
        //声明Stopwatch
        Stopwatch st=new Stopwatch();
        //执行开始
        st.Start();
        var result=from a in _db.productus
                   join b in _db.shippers
                   on a.SupplierId equals b.ShipperId into GRP
                   from GRP2 in GRP.DefaultIfEmpty()
                   select new {a.ProductName, GRP = GRP2};
        foreach (var item in result)
        {
            Console.WriteLine("产品名称:" + item.ProductName);
            Console.WriteLine("---------------------------------");
            Console.WriteLine("供应商编号:" + item.GRP.ShipperId);
            Console.WriteLine("供应商名称:" + item.GRP.CompanyName);
            Console.WriteLine("联系电话:" + item.GRP.Phone);
            Console.WriteLine("---------------------------------");
        }
        //执行结束
        st.Stop();
        Console.WriteLine("用时:{0}毫秒", st.ElapsedMilliseconds);
        Console.ReadKey();
    }
}

2.Lambda 写法

  • 语法格式:(自己总结,不喜勿喷)
GroupJoin<TOuter,TInner,TKey,TResult>
(IEnumerable<TOuter>,            //要联接的第一个序列。
IEnumerable<TInner>,             //要与第一个序列联接的序列。
Func<TOuter,TKey>,               //用于从第一个序列的每个元素提取联接键的函数。
Func<TInner,TKey>,               //用于从第二个序列的每个元素提取联接键的函数。
Func<TOuter,IEnumerable<TInner>, //用于从第一个序列的元素和第二个序列的匹配元素集合中创建结果元素的函数。
TResult>);                       //结果元素的类型。

实体对象.GroupJoin(联接第一个实体,
第一个实体联接,
从第一个实体的每个元素提取联接键的函数,
(变量1,变量2)=> new {查询字段};
);
  • 具体实例
static void GroupJoinQuery()
{
    //上下文依赖
    using(DatabaseContext _db=new DatabaseContext())
    {
        //声明Stopwatch
        Stopwatch st=new Stopwatch();
        //执行开始
        st.Start();
        //实体1
        var mdl=_db.productus.ToList();
        //实体2
        var md2=_db.shippers.ToList();
        var result=mdl.GroupJoin(md2,a => a.SupplierId,cs => cs.ShipperId,(a, c) => new
                    {
                         pname = a.ProductName,
                         sname = c    
                    });
         foreach (var item in result)
         {
            Console.WriteLine($"{item.pname}");
            foreach (var items in item.sname)
            {
                Console.WriteLine($"{items.CompanyName}");
            }
         }
         //执行停止
         st.Stop();
         Console.WriteLine("用时:{0}毫秒", st.ElapsedMilliseconds);
         Console.ReadKey();
    }
}

七、排序分页


1.Linq 写法

  • 语法格式:(自己总结,不喜勿喷)
IQueryable<实体对象> 变量名称=(from (变量) in 上下文.实体对象 orderby 变量.字段 select (变量)).Skip(0).Take(10);

返回IQueryable<T>;

  • 具体实例
static void OrderByPageQuery()
{
    //上下文依赖
    using(DatabaseContext _db=new DatabaseContext())
    {
        //声明Stopwatch
        Stopwatch st=new Stopwatch();
        //执行开始
        st.Start();
        //查询前五条记录
        var result=(from q in _db.shippers
                   orderby q.ShipperId
                   select q).Skip(0).Take(5);
        //输出
        foreach (var item in result)
        {
            Console.WriteLine("供应商编号:" + item.ShipperId);
            Console.WriteLine("供应商名称:" + item.CompanyName);
            Console.WriteLine("联系电话:" + item.Phone);
            Console.WriteLine("---------------------------------");
        }
        //执行结束
        st.Stop();
        Console.WriteLine("用时:{0}毫秒", st.ElapsedMilliseconds);
        Console.ReadKey();
    }
}

2.Lambda 写法

  • 语法格式
IQueryable<T> (变量)=上下文对象.OrderBy(lambda表达式).Ship(0).Take(5);

返回IQueryable<T>;

  • 具体实例
static void OrderByPageQuery()
{
    //上下文依赖
    using(DatabaseContext _db=new DatabaseContext())
    {
        //声明Stopwatch
        Stopwatch st=new Stopwatch();
        //执行开始
        st.Start();
        //查询前五条记录
        var result=_db.shippers.OrderBy(c => c.ShipperId).Skip(0).Take(5);
        //输出
        foreach (var item in result)
        {
            Console.WriteLine("供应商编号:" + item.ShipperId);
            Console.WriteLine("供应商名称:" + item.CompanyName);
            Console.WriteLine("联系电话:" + item.Phone);
            Console.WriteLine("---------------------------------");
        }
        //执行结束
        st.Stop();
        Console.WriteLine("用时:{0}毫秒", st.ElapsedMilliseconds);
        Console.ReadKey();
    }
}

学如逆水行舟,不进则退。持续学习ing....

posted @ 2019-09-16 14:14  我是小柒  阅读(307)  评论(0编辑  收藏  举报