linq to sql loadwith 与 Associatewith

问题描述 投票:0回答:2

loadwith 和 Associatewith 有什么区别?从我读的文章来看,loadwith似乎用于加载附加数据(例如客户的所有订单),而AssociateWith用于过滤数据。

这样的理解正确吗?如果有人可以用基于示例的解释来解释这一点,那就太好了。

c# linq-to-sql
2个回答
36
投票

LoadWith
用于执行关联的热切加载,而不是默认的延迟加载

通常,关联会在您第一次引用它们时加载。 这意味着,如果您选择 100 个

Order
实例,然后对每个
Details
执行某些操作,那么您实际上是在对数据库执行 101 次
SELECT
操作。 另一方面,如果
LoadOptions
指定
LoadWith<Order>(o => o.Details)
,那么这一切都在单个
SELECT
中完成,并添加了
JOIN

AssociateWith
对加载关联的 when 没有任何影响,只是加载 what。 每次加载关联时,它都会添加一个
WHERE
子句。

正如你所说,

AssociateWith
用于自动过滤数据。 通常,如果您知道关联具有大量元素并且您只需要其中的特定子集,则可以使用此方法。 再说一次,它主要是性能优化,只是不同的一种。


9
投票

是的,您的理解是正确的; 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;
© www.soinside.com 2019 - 2024. All rights reserved.