linq to sql loadwith vs associatewith
loadwith和associatewith之间有什么区别。 从我读过的文章看来,loadwith似乎用于加载附加数据(例如,客户的所有订单)。 而AssociateWith用于过滤数据。
这是正确的理解吗? 如果有人能够通过基于示例的解释来解释这一点,那也很好。
LoadWith
用于执行关联的急切加载 ,而不是默认的延迟加载 。
通常,在您第一次引用关联时会加载关联。 这意味着如果您选择100个Order
实例,然后对其每个Details
进行一些操作,那么您实际上是在对数据库执行101个SELECT
操作。 另一方面,如果LoadOptions
指定LoadWith
,那么它全部在一个SELECT
完成,并添加了JOIN
。
AssociateWith
对加载关联的时间没有任何影响,只是加载了什么 。 每次加载关联时,它都会添加一个WHERE
子句。
如你所说, AssociateWith
用于自动过滤数据。 通常,如果您知道关联具有大量元素并且您只需要它们的特定子集,则可以使用此方法。 同样,它主要是性能优化,只是一种不同的类型。
是的,你的理解是正确的; AssociateWith在查询之前过滤数据,而LoadWith返回查询中的关联对象。 执行LoadWith的原因是您可以在单个查询中返回关联对象。 否则,在迭代关联对象时将进行额外的db调用。
亲自尝试不同的示例,并查看通过Profiler或其他记录器生成的SQL。 请记住,在执行任何查询之前,需要在DataContext上设置这些选项。
请查看以下链接(MSDN)中的示例。 我刚刚复制了他们在那里使用的例子。
LoadWith
DataLoadOptions dlo = new DataLoadOptions(); dlo.LoadWith(c => c.Orders); db.LoadOptions = dlo; var londonCustomers = from cust in db.Customers where cust.City == "London" select cust;
AssociateWith
DataLoadOptions dlo = new DataLoadOptions(); dlo.AssociateWith( c => c.Orders.Where(p => p.ShippedDate != DateTime.Today)); db.LoadOptions = dlo; var custOrderQuery = from cust in db.Customers where cust.City == "London" select cust;