加载关联表的数据 延迟加载

 

讲解之前,先来看一下我们的数据库结构:班级表 学生表

延迟加载

复制代码
//延迟加载
using (var db = new Entities())
{
    //查询班级
    var classes = (from v in db.Classes
                    where v.ClassName == "机电10501"
                    select v).Single();
    if (classes.Student != null)
    {
        //遍历该班级所有学生
        foreach (var st in classes.Student)
        {
            ObjectDumper.Write(st.StudentName);
        }
    }
}
复制代码

追踪SQL语句:

说明:主表使用.运算符调用从表都是延迟加载 导航属性需要设置为(virtual)
此处执行了两句SQL 先查询班级表->再查询学生表

不恰当的使用延迟加载会发送很多多余的sql

演示程序:遍历所有班级和学生

复制代码
using (var db = new Entities())
{
    //遍历班级
    foreach(var cls in db.Classes)
    {
        Console.WriteLine("========="+cls.ClassName);
        //遍历该班级所有学生
        foreach (var st in cls.Student)
        {
            ObjectDumper.Write(cls.ClassName + "-" + st.StudentName);
        }
    }
}
复制代码

追踪SQL语句:

说明:此处执行了5条SQL语句,先查询所有班级,然后根据每个班级ID 查询 各班学生。

关闭延迟加载有两种方式:

方法一:去掉Virtual修饰 如图

执行代码:

结果:

此处只执行了一条SQL,所以未加载出学生信息。

 

方法二:在Entities上下本类构造函数中调用 Configuration.LazyLoadingEnabled =false

 

执行结果相同:

posted @ 2019-12-02 11:00  清语堂  阅读(221)  评论(0编辑  收藏  举报