【问题标题】:Entity Framework Core2 LINQ - each join runs as a separate queryEntity Framework Core2 LINQ - 每个连接都作为一个单独的查询运行
【发布时间】: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(),但没有任何区别,仍然是多个查询。 dbDbContext,使用核心 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


【解决方案1】:

根据LINQ2SQL文档:

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

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

这是延迟加载与急切加载的问题。

这是一篇很好的帖子,有很好的解释。

Lazy Loading And Eager Loading In LINQ To SQL

【讨论】:

  • 嗯,你没有,但我认为这与这个问题没有任何关系。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-25
  • 1970-01-01
  • 1970-01-01
  • 2021-01-18
  • 2012-12-06
相关资源
最近更新 更多