我喜欢使用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>();
我检查它生成了超过1个SQL查询,如我所料。实际上它只对Product和OrderDetails进行急切加载,并且逐个查询ProductCompany。我这里做错了吗?或者它是Linq2SQL问题?我们有任何解决方法吗?
非常感谢!
更新 我从SQL事件探查器检查sql。我发现Leppie和Ian都是正确的。它们在一次交易中受限制。但当我将其设置为延迟加载时,它会打开多个连接。
答案 0 :(得分:17)
我也在一些代码中遇到了这个问题,经过大量的实验和谷歌搜索后,看起来LINQ只能从每个表中加入一对一的关系:如果你试图指定多个来预加载它只是(随机?)选择哪一个预加载,哪些其他离开延迟(简单地忽略那些LoadWith提示)
其他人也发布了这个,例如
答案 1 :(得分:3)
不,你没有做错任何事情,Linq2SQL在一个事务中批处理所有内容,但可能会对所需结果执行无限数量的查询。 DataLoadOptions
通常仅在DataContext
不适用于结果使用的整个上下文时使用。如果你可以在执行期间保持DataContext
活着,最好依赖延迟执行(默认)。
答案 2 :(得分:2)
根据文件:
当您查询对象时,实际上只检索您请求的对象。不会同时自动提取相关对象。
DataLoadOptions类提供了两种方法来实现指定相关数据的立即加载。 LoadWith方法允许立即加载与主目标相关的数据。 AssociateWith方法允许过滤相关对象。
拥有多个sql语句并不让我感到惊讶。我认为这里的区别是所有语句都只是在前面加载而不是根据需要延迟加载它们。