文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Linq如何实现延迟加载

2023-06-17 22:26

关注

小编给大家分享一下Linq如何实现延迟加载,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

Linq延迟加载

在查询某对象时,实际上你只查询该对象。不会同时自动获取这个对象。这就是Linq延迟加载。

例如,您可能需要查看客户数据和订单数据。你最初不一定需要检索与每个客户有关的所有订单数据。其优点是你可以使用Linq延迟加载将额外信息的检索操作延迟到你确实需要检索它们时再进行。请看下面的示例:检索出来CustomerID,就根据这个ID查询出OrderID。

var custs =  from c in db.Customers  where c.City == "Sao Paulo"  select c;  //上面的查询句法不会导致语句立即执行,仅仅是一个描述性的语句,  只有需要的时候才会执行它  foreach (var cust in custs)  {  foreach (var ord in cust.Orders)  {  //同时查看客户数据和订单数据  }  }

语句描述:原始查询未请求数据,在所检索到各个对象的链接中导航如何能导致触发对数据库的新查询。

Linq延迟加载:LoadWith 方法

你如果想要同时查询出一些对象的集合的方法。LINQ to SQL 提供了 DataLoadOptions用于立即加载对象。方法包括:
LoadWith 方法,用于立即加载与主目标相关的数据。
AssociateWith 方法,用于筛选为特定关系检索到的对象。

使用 LoadWith方法指定应同时检索与主目标相关的哪些数据。例如,如果你知道你需要有关客户的订单的信息,则可以使用 LoadWith 来确保在检索客户信息的同时检索订单信息。使用此方法可仅访问一次数据库,但同时获取两组信息。
在下面的示例中,我们通过设置DataLoadOptions,来指示DataContext在加载Customers的同时把对应的Orders一起加载,在执行查询时会检索位于Sao Paulo的所有 Customers 的所有 Orders。这样一来,连续访问 Customer 对象的 Orders 属性不会触发新的数据库查询。在执行时生成的SQL语句使用了左连接。

NorthwindDataContext db = new NorthwindDataContext();  DataLoadOptions ds = new DataLoadOptions();  ds.LoadWith<Customer>(p => p.Orders);  db.LoadOptions = ds;  var custs = (  from c in db2.Customers  where c.City == "Sao Paulo"  select c);  foreach (var cust in custs)  {  foreach (var ord in cust.Orders)  {  Console.WriteLine("CustomerID {0} has an OrderID {1}.",  cust.CustomerID,  ord.OrderID);  }  }

语句描述:在原始查询过程中使用 LoadWith 请求相关数据,以便稍后在检索到的各个对象中导航时不需要对数据库进行额外的往返。

Linq延迟加载:AssociateWith方法

使用 AssociateWith 方法指定子查询以限制检索的数据量。
在下面的示例中,AssociateWith 方法将检索的 Orders 限制为当天尚未装运的那些 Orders。如果没有此方法,则会检索所有 Orders,即使只需要一个子集。但是生成SQL语句会发现生成了很多SQL语句。

NorthwindDataContext db2 = new NorthwindDataContext();  DataLoadOptions ds = new DataLoadOptions();  ds.AssociateWith<Customer>(  p => p.Orders.Where(o => o.ShipVia > 1));  db2.LoadOptions = ds;  var custs =  from c in db2.Customers  where c.City == "London"  select c;  foreach (var cust in custs)  {  foreach (var ord in cust.Orders)  {  foreach (var orderDetail in ord.OrderDetails)  {  //可以查询出cust.CustomerID, ord.OrderID, ord.ShipVia,  //orderDetail.ProductID, orderDetail.Product.ProductName  }  }  }

语句描述:原始查询未请求数据,在所检索到各个对象的链接中导航如何以触发对数据库的新查询而告终。此示例还说明在Linq延迟加载关系对象时可以使用 Assoicate With 筛选它们。

以上是“Linq如何实现延迟加载”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注编程网行业资讯频道!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯