【发布时间】:2017-08-17 00:40:32
【问题描述】:
我的 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(
表,删除转换生成单个查询。
【问题讨论】:
-
好吧,你绝对不需要那些
AsQueryable电话。你为什么要这么做...on new{ table2.Col2, table2.Col2 } equals new { table3.Col2, table3.Col2 }? -
@BradleyUffner 我试图看看他们是否会有所作为,但他们没有。
-
@BradleyUffner 查看编辑,两次输入错误的相同列名。
-
是否所有其他(未显示)都加入了 sql 对象?您没有加入本地
IEnumerable的任何内容吗? -
嗯,我真的没有看到您的代码有任何问题会导致这种情况。最后一招……查询中访问的所有属性都是由简单的表达式组成的吗?它们都不是执行应用程序端逻辑的基于代码的属性?
标签: c# asp.net-mvc asp.net-core entity-framework-core