linq2sql中简单的Eager / Lazy加载示例

本文关键字:Lazy 加载 Eager 简单 linq2sql | 更新日期: 2023-09-27 18:12:00

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

linq2sql中简单的Eager / Lazy加载示例

  • 延迟加载:对于给定的实体,它的关联集合在第一次加载时可能是空的,但是当这些集合第一次迭代时,LINQ to SQL在加载后触发一个查询来加载这些集合,然后这些集合可以供将来使用,而不需要另一个查询:

    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
        }
    }
    

OrderDetails只有在被迭代时才会被加载,所以如果OrderDetatils没有被迭代,相应的查询就不会被执行。

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

    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
        }
    }
    

注意:延迟执行是LINQ特性但是延迟加载是LINQ to SQL特性