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

7

有人有一个简单的Linq2Sql代码示例,演示急加载和惰性加载之间的区别吗?


5
LINQ只是一组扩展方法和语言语法。你可能指的是Entity Framework或LINQ to SQL,或者是延迟执行。 - SLaks
@SLaks 是的,我指的是 Lin2Sql。我已经更新了问题。现在我有点困惑 :-) 我以为延迟执行就是惰性加载?我猜这是一个单独的问题。 - Brendan
1
延迟执行是指查询直到实际使用时才被执行。惰性加载有点类似,只不过您推迟了关联的加载,直到它实际需要为止。这是一个很好的链接,可以帮助您理解延迟执行:http://blogs.msdn.com/b/charlie/archive/2007/12/09/deferred-execution.aspx - Phill
@zener - 没问题,您需要帮助了解L2S中的Eager / Lazy加载吗?还是理解两者之间的区别? - Phill
@Phil,我想了解何时使用它们中的任何一个,希望有一个代码示例可以帮助解释。 - Brendan
1个回答

10
  • 延迟加载:对于给定的实体,当它首次加载时,与其关联的集合可能为空,但是当这些集合首次被迭代时,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,因此如果从未迭代OrderDetails,则不会执行相应的查询。

  • 急切加载:立即加载所有引用实体的关联集合,例如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到SQL的特性


2
“Deffered Loading”是“懒加载”,并且几乎是每个ORM的一个特性。 - Phill
当然,几乎每个 ORM 都有这个特性,但是我把它作为一个注释添加上去,以区分它们,在此之前的所有评论都指向了延迟执行,但 OP 的问题是关于延迟加载的,所以在这个上下文中是有效的。 - Mahmoud Gamal
我知道,我的观点是同样的事情,只是L2S称之为不同的名称。因此,对于来到这个问题并看到答案并说“他为什么谈论延迟执行”的人来说,他们知道在L2S中它只是一个具有不同名称的Lazy Loading。 - Phill

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接