Linq2SQl急切加载多个DataLoadOptions

Lia*_* Wu 12 .net linq linq-to-sql

我喜欢使用Linq2SQL通过eager-loading来获取数据.代码类似于:

       DataLoadOptions options = new DataLoadOptions();

       options.LoadWith<Product>(c => c.ProductCompanies);

       options.LoadWith<Product>(c => c.OrderDetails);

       db.LoadOptions = options;

       IEnumerable<Product> products = db.Products.ToList<Product>();
Run Code Online (Sandbox Code Playgroud)

我检查它生成了超过1个SQL查询,如我所料.实际上它只对Product和OrderDetails进行急切加载,并且逐个查询ProductCompany.我这里做错了吗?或者它是Linq2SQL问题?我们有任何解决方法吗?

非常感谢!

更新: 我从SQL事件探查器检查sql.我发现Leppie和Ian都是正确的.它们在一次交易中受限制.但是当我将其设置为延迟加载时,它会打开多个连接.

小智 17

我在一些代码中也遇到了这个问题,经过大量的实验和谷歌搜索后,看起来LINQ只能从每个表中加入一对一的关系:如果你试图指定多个来预加载它(随机?)选择哪一个预加载和哪些其他离开延迟(简单地忽略那些LoadWith提示)

例如,其他人也发布了这个

http://codebetter.com/blogs/david.hayden/archive/2007/08/06/linq-to-sql-query-tuning-appears-to-break-down-in-more-advanced-scenarios.aspx

  • 不错的链接.更好的是,这个答案实际上回答了问题 - *"为什么文件不正确和/或误导"*?`LoadWith <T>`可以很容易地*静默地失败*或*做自己的事情*并在访问DataContext生命周期之外的项时导致问题.我甚至不关心效率 - 我只想要工作语义.我发现有效处理此问题的唯一可靠方法是在DataContext范围内手动*强制*访问. (2认同)

lep*_*pie 3

不,您没有做错任何事,Linq2SQL 在单个事务中批处理所有内容,但可能会执行无限数量的查询以获得所需的结果。DataLoadOptions通常仅在DataContext结果用法的整个上下文不可用时才使用。如果您可以DataContext在执行期间保持活动状态,那么最好依赖延迟执行(这是默认的)。