我的C#MVC控制器中有这样的东西:
from table1 in db.Table1.AsQueryable()
join table2 in db.Table2.AsQueryable() on table1.Col1 equals table2.Col1
join table3 in db.table3.AsQueryable() on new { table2.Col2, table2.Col5 } equals new { table3.Col2, table3.Col5 }
.
.
few more joins
.
.
WHERE ......
select new {table1.Prop1, table2.Prop2, table3.Prop3}
当我观察它在SQL事件探查器上运行的内容时,我期待一个包含所有连接的查询。相反,它在不同的查询中选择所有表中的所有列。即运行
SELECT * FROM Table2 --Instead of * it has all column names
当它完成运行时,它会运行
SELECT * FROM Table3 --Instead of * it has all column names
每个表的等等。表很大,所以使用大量内存需要太长时间。我在实体上添加了AsQueryable()
,但它没有任何区别,仍然是多个查询。 db
是DbContext
,使用核心2。
如何更改LINQ或其他设置,以便整个操作作为单个查询运行?
更新
看起来问题是由其中一个连接列上的Convert.ToInt32(
引起的。我加入的int
列在一个表中可以为空,在另一个表中是不可为空的,我在可空的上有Convert.ToInt32(
表,删除转换生成单个查询。
答案 0 :(得分:0)
根据LINQ2SQL文件:
当您查询对象时,实际上只检索您请求的对象。不会同时自动提取相关对象。
DataLoadOptions类提供了两种方法来实现指定相关数据的立即加载。 LoadWith方法允许立即加载与主目标相关的数据。 AssociateWith方法允许过滤相关对象。
这是延迟加载与预先加载的问题。
这是一篇很好的解释。