实体框架的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(),但它没有什么区别,仍然是多个查询。 dbDbContext,使用核心2.

如何更改LINQ或其他设置,使整个事件作为单个查询运行?

更新

它看起来像这个问题是由具有连接列上的一个Convert.ToInt32(造成的。我加入的int列在一个表中可以为空,而在另一个表中不可以为空,因此我可以在可空的 表上删除Convert.ToInt32(,删除转换生成的单个查询。

+2

那么,你绝对不需要那些'AsQueryable'调用。你为什么要这样做......在新的{table2.Col2,table2.Col2}等于new {table3.Col2,table3.Col2}'? –

+0

@BradleyUffner我试图看看他们是否会有所作为,但他们没有。 – curious

+0

@BradleyUffner查看编辑,错误输入了两次相同的列名。 – curious

根据LINQ2SQL文件:

当查询的对象,你实际上只检索您请求的对象。相关对象不会自动同时获取。

DataLoadOptions类提供了两种方法来实现立即加载指定的相关数据。 LoadWith方法允许立即加载与主要目标相关的数据。 AssociateWith方法允许过滤相关对象。

这是Lazy Loading vs Eager Loading的问题。

这是一篇很好的文章,有很好的解释。

Lazy Loading And Eager Loading In LINQ To SQL

+2

嗯,你不是*错误*,但我不认为这与这个问题有任何关系。 –