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