代码之家  ›  专栏  ›  技术社区  ›  stackoverflowuser

Linq to SQL LoadWith与AssociateWith

  •  22
  • stackoverflowuser  · 技术社区  · 15 年前

    LoadWith和AssociateWith的区别是什么?从我读到的文章中,似乎LoadWith用于加载附加数据(例如客户的所有订单)。而associateWith用于筛选数据。

    这是正确的理解吗?另外,如果有人能用一个基于实例的解释来解释这一点也会很好。

    2 回复  |  直到 15 年前
        1
  •  33
  •   Aaronaught    15 年前

    LoadWith 用于执行 急迫载荷 与违约相反的关联 怠速载荷 .

    通常,关联在您第一次引用它们时加载。这意味着如果你选择100 Order 实例,然后对每个实例 Details 你真的在表演101 SELECT 对数据库的操作。另一方面,如果 LoadOptions 指定 LoadWith<Order>(o => o.Details) ,那么这一切都是在一个单一的 选择 加上 JOIN .

    AssociateWith 对…没有任何影响 什么时候 关联已加载,只是 什么 已加载。它增加了一个 WHERE 每次加载关联时都使用子句。

    正如你所说的, 联想到 习惯于 自动地 过滤数据。通常,如果您知道一个关联有大量的元素,并且您只需要它们的一个子集,那么您就可以使用它。同样,它主要是一种性能优化,只是一种不同的优化。

        2
  •  8
  •   David    15 年前

    是的,您的理解是正确的;associateWith在查询前过滤数据,而loadWith在查询中返回关联的对象。执行loadWith的原因是,您可以在一个查询中返回关联的对象。否则,当您迭代关联的对象时,将进行额外的DB调用。

    您自己也可以尝试不同的示例,并查看通过探查器或其他记录器生成的SQL。请记住,在执行任何查询之前,需要在DataContext上设置这些选项。

    请看下面链接(msdn)中的示例。我刚刚复制了他们在那里使用的例子。

    LoadWith

    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;
    

    AssociateWith

    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;