zoukankan      html  css  js  c++  java
  • Entity Framework(04):主从表数据加载方式

    一、延迟加载:LazyLoading

    使用延迟加载,关联的实体必须标注为virtual。

    本例是标注Destination类里的Lodgings为virtual。因为先发sql去查询主键对象,然后根据主键id去从表里查相关联的数据。

    private static void TestLazyLoading()
        {
            using (var context = new CodeFirst.DataAccess.BreakAwayContext())
            {
               var canyon = (from d in context.Destinations where d.Name == "Grand Canyon" select d).Single();
    
               var distanceQuery = from l in canyon.Lodgings   //延迟加载canyon的所有.Lodgings
                                    where l.Name == "HuangShan Hotel"
                                    select l;
                foreach (var lodging in distanceQuery)
                    Console.WriteLine(lodging.Name);
            }
        }

    改进:在数据库中操作,显示加载

    private static void QueryLodgingDistancePro()
        {
            using (var context = new CodeFirst.DataAccess.BreakAwayContext())
            {
                var canyon = (from d in context.Destinations where d.Name == "Grand Canyon" select d).Single();
                var lodgingQuery = context.Entry(canyon).Collection(d => d.Lodgings).Query();//接下来的查询在数据库中,包括Count()等
                var distanceQuery = from l in lodgingQuery 
                                     where l.Name == "HuangShan Hotel" 
                                     select l;
    
                foreach (var lodging in distanceQuery)
                    Console.WriteLine(lodging.Name);
            }
        }

    二、贪婪加载:EagerLoading

    private static void TestEagerLoading()
        {
            using (var context = new CodeFirst.DataAccess.BreakAwayContext())
            {
                // var allDestinations = context.Destinations.Include(d => d.Lodgings);
                var AustraliaDestination = context.Destinations.Include(d => d.Lodgings).Where(d => d.Name == "Bali");
                //context.Lodgings.Include(l => l.PrimaryContact.Photo);
                //context.Destinations.Include(d => d.Lodgings.Select(l => l.PrimaryContact));
                //context.Lodgings.Include(l => l.PrimaryContact).Include(l => l.SecondaryContact);
                foreach (var destination in AustraliaDestination)
                {
                    foreach (var lodging in destination.Lodgings)
                        Console.WriteLine(" - " + lodging.Name);
                }
            }
        }

    三、显示加载:ExplicitLoading

    1、查找导航属性为一个集合的

    private static void LoadRelateData()
        {
            using (var context = new CodeFirst.DataAccess.BreakAwayContext())
            {
               var canyon = (from d in context.Destinations where d.Name == "Grand Canyon" select d).Single();
    
               context.Entry(canyon).Collection(d => d.Lodgings).Load();  //显示加载
    
               foreach (var lodging in context.Lodgings.Local)
                    Console.WriteLine(lodging.Name);
            }
        }

    2、查找导航属性为一个实体对象

    private static void LoadPrimaryKeyData()
        {
            using (var context = new CodeFirst.DataAccess.BreakAwayContext())
            {
                var lodging = context.Lodgings.First();
    
                context.Entry(lodging).Reference(l => l.Destination).Load();
    
               foreach (var destination in context.Destinations.Local)   //遍历的是内存中的Destinations数据
                    Console.WriteLine(destination.Name);
            }
        }
  • 相关阅读:
    第二个冲刺
    实验四主存空间的分配和回收
    Sprint总结
    Sprint回顾
    Scrum项目5.0
    hibernate jpa 注解 @Temporal(TemporalType.DATE) 格式化时间日期,页面直接得到格式化类型的值
    获得HttpServletResponse及其他对象
    UUID.randomUUID()方法介绍
    psp个人软件过程需求文档
    电子产品自动搜索比价系统设计与实现 项目愿景与范围
  • 原文地址:https://www.cnblogs.com/springsnow/p/13251419.html
Copyright © 2011-2022 走看看