• FreeSql学习笔记——10.贪婪加载


    前言

      FreeSql贪婪加载主要对应导航属性,将需要的数据一次加载出来,包括查询表的子表或者关联表的关联数据,用于一对一、一对多、多对一、多对多的关系数据查询,查询的时候一对一、多对一关系查询是可以看作一种结构(主数据带上一条附加数据),一对多、多对多合为一种结构(主数据带一个数据集)。

     

    一对一/多对一

      使用导航关系加载关联数据导航属性通过 ToList(includeNestedMembers: false) 加载,默认false, 返回 2 级 Join 的导航数据;true表示返回所有层级深度 Join 的导航数据,必须有导航属性
    _freeSql.Select<Student>().Include(a => a.Class).ToList(true);
    //SELECT a.[Id], a.[Name], a.[Age], a.[Status], a.[AddTime], a.[Remark], a.[Version], a.[ClassId],
    //a__Class.[Id] as9, a__Class.[Name] as10
    //FROM[Student] a
    //LEFT JOIN[Class] a__Class ON a__Class.[Id] = a.[ClassId]
    
    _freeSql.Select<Student>().Where(a => a.Class.Id == 1).ToList(true);
    //SELECT a.[Id], a.[Name], a.[Age], a.[Status], a.[AddTime], a.[Remark], a.[Version], a.[ClassId],
    //a__Class.[Id] as9, a__Class.[Name] as10
    //FROM[Student] a
    //LEFT JOIN[Class] a__Class ON a__Class.[Id] = a.[ClassId]
    //WHERE(a__Class.[Id] = 1)
     

    一对多/多对多

      使用IncludeMany()查询会产生两个sql语句,查询出两个结果集拼装在一起,从而实现贪婪加载
    _freeSql.Select<Class>()
        .IncludeMany(x => x.StudentList,then=>then
            .Where(s=>s.Name.StartsWith("小明")))
        .Where(x => x.Id == 1)
        .ToList();
    //SELECT a.[Id], a.[Name]
    //FROM[Class] a
    //WHERE(a.[Id] = 1)
    //SELECT a.[Id], a.[Name], a.[Age], a.[Status], a.[AddTime], a.[Remark], a.[Version], a.[ClassId]
    //FROM[Student] a
    //WHERE(((a.[ClassId]) in (1))) AND(((a.[Name]) LIKE '小明%'))
     

    扩展

      无导航关系情况下主动设置字段关联,关联表在IncludeMany()中写查询条件,查询字段等;这种方式与上一种差不多,主要在于无导航属性,需要加上关联字段
    _freeSql.Select<Class>()
                    .IncludeMany(x=>x.StudentList
                        .Where(s=>s.ClassId==x.Id)
                        .Select(a=>new Student{ Name= a.Name })
                    .Take(10))
                    .Where(x => x.Id == 1)
                    .ToList();
    //SELECT a.[Id], a.[Name]
    //FROM[Class] a
    //WHERE(a.[Id] = 1)
    //SELECT TOP 10 a.[Name] as1, a.[ClassId] as2
    //FROM[Student] a
    //WHERE((a.[ClassId] = 1))
     
     切记使用贪婪加载方式,如果关联数据是一条记录,那么会jion两个表查询,如果关联数据是一个数据集,那么会执行两次sql,一次查询主数据,一次根据关联字段查询关联数据
      与延迟加载相反,贪婪加载查询效率、数据库交互频率会低于延迟加载。
     
     
     
     
     
     
     
  • 相关阅读:
    51 nod 1109 01组成的N的倍数
    zoj 1530 Find The Multiple
    洛谷 P1124 文件压缩
    洛谷 P1270 “访问”美术馆(树形DP)
    洛谷 P1272 重建道路(树形DP)
    ♫【CSS】命名颜色
    【注释】
    -_-#【命名】BEM
    ☀【jQuery插件】DOM 延迟渲染
    ☀【组件】getRequest
  • 原文地址:https://www.cnblogs.com/zousc/p/16329294.html
Copyright © 2020-2023  润新知