实体框架的Core2 LINQ - 每个连接可以作为独立的查询
我有这样的事情在我的C#MVC控制器:实体框架的Core2 LINQ - 每个连接可以作为独立的查询
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(
,删除转换生成的单个查询。
根据LINQ2SQL文件:
当查询的对象,你实际上只检索您请求的对象。相关对象不会自动同时获取。
DataLoadOptions类提供了两种方法来实现立即加载指定的相关数据。 LoadWith方法允许立即加载与主要目标相关的数据。 AssociateWith方法允许过滤相关对象。
这是Lazy Loading vs Eager Loading的问题。
这是一篇很好的文章,有很好的解释。
嗯,你不是*错误*,但我不认为这与这个问题有任何关系。 –
那么,你绝对不需要那些'AsQueryable'调用。你为什么要这样做......在新的{table2.Col2,table2.Col2}等于new {table3.Col2,table3.Col2}'? –
@BradleyUffner我试图看看他们是否会有所作为,但他们没有。 – curious
@BradleyUffner查看编辑,错误输入了两次相同的列名。 – curious