linq to sql loadwith vs associatewith

sta*_*ser 22 c# linq-to-sql

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

这是正确的理解吗?如果有人能够通过基于示例的解释来解释这一点,那将是很好的.

Aar*_*ght 34

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

通常,在您第一次引用关联时会加载关联.这意味着如果您选择100个Order实例,然后对每个实例执行某些操作Details,那么您实际上是在SELECT对数据库执行101个操作.另一方面,如果LoadOptions指定LoadWith<Order>(o => o.Details),那么它全部在一个单独SELECT添加JOIN.

AssociateWith没有任何影响时,该协会被加载,只是什么被加载.WHERE每次加载关联时都会添加一个子句.

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

  • 这一行让我明白了"AssociateWith对加载关联的时间没有任何影响,只是加载了什么".谢谢. (6认同)

Dav*_*vid 9

是的,你的理解是正确的; AssociateWith在查询之前过滤数据,而LoadWith返回查询中的关联对象.执行LoadWith的原因是您可以在单个查询中返回关联对象.否则,在迭代关联对象时将进行额外的db调用.

亲自尝试不同的示例,并查看通过Profiler或其他记录器生成的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;
Run Code Online (Sandbox Code Playgroud)

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;
Run Code Online (Sandbox Code Playgroud)