linq2sql 中的简单急切/延迟加载示例

发布于 2024-12-11 13:00:30 字数 50 浏览 0 评论 0原文

有人在 linq2sql 中有一个简单的代码示例来演示急切加载和延迟加载之间的区别吗?

Does anyone have a simple code example in linq2sql that demonstrates the difference between Eager Loading and Lazy Loading?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

自找没趣 2024-12-18 13:00:30
  • 延迟加载:对于给定实体,首次加载时其关联集合可能为空,但首次迭代这些集合时,LINQ to SQL 会触发查询以在之后加载这些集合加载后,集合可供将来使用,无需再次查询:

    var query = from o in db.GetTable() //db 是数据上下文
            选择o;
    foreach(查询中的顺序 o)
    {
        foreach(OrderDetail d in o.OrderDetails)//延迟加载
        {
           //对这些集合做一些事情
        }
    }
    

OrderDetails 仅在迭代时才加载,因此如果 OrderDetails 是never iterated 相应的查询永远不会执行。

  • 预加载:立即加载所有引用实体的关联集合,例如 LINQ to SQL 将自动为所有检索的订单带来所有OrderDetails

    DataLoadOptions op = new DataLoadOptions();
    op.LoadWith(o => o.OrderDetails);
    db.LoadOptions = op;
    var query = from o in db.GetTable() 
             选择o;
    foreach(查询中的顺序 o)
    { 
        //订单详细信息已预先加载;不需要额外的查询
        foreach(o.OrderDetails 中的 OrderDetail d)
        {
           //做某事
        }
    }
    

请注意:延迟执行是 LINQ 功能,但延迟加载是 LINQ to SQL 功能

  • Deferred Loading: for a given entity, it's associated collections may be empty when it is first loaded, but when these collections are first iterated, LINQ to SQL fires off a query to load these collections after it is loaded the collection is then available for future use without requiring another query:

    var query = from o in db.GetTable<Order>() //db is the datacontext
            select o;
    foreach(Order o in query)
    {
        foreach(OrderDetail d in o.OrderDetails)//Deferred loading
        {
           //Do something on these collections
        }
    }
    

The OrderDetails are loaded only if it is iterated, so If the OrderDetatils are never iterated the corresponding query is never executed.

  • Eager Loading: immediate loading the associated Collections for all referenced entities for example LINQ to SQL will automatically brings all the OrderDetails for all the retreived Orders

    DataLoadOptions op = new DataLoadOptions();
    op.LoadWith<Order>(o => o.OrderDetails);
    db.LoadOptions = op;
    var query = from o in db.GetTable<Order>() 
             select o;
    foreach(Order o in query)
    { 
        //Order details are eager loaded; additional queries are not needed
        foreach(OrderDetail d in o.OrderDetails)
        {
           //do something
        }
    }
    

note that: Deferred execution is a LINQ Feature but Deferred Loading is a LINQ to SQL feature

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文