【问题标题】:ObjectSet from Entity Framwork is too big实体框架中的对象集太大
【发布时间】:2021-08-24 11:14:49
【问题描述】:

我有一个名为 AllTables 的 ObjectSet,其中包括表 Table1、table2、tabl3... 但现在它比我尝试在 AllTable 中进行选择时大得多,但出现以下异常

SqlException:内部错误:表达式服务限制已被限制 到达。请在您的 查询,并尝试简化它们。

那个是查询,AllTables 是一个包含多个实体的实体集。当您在 entitySet 上进行选择时,EF 会在构成 setobject 的所有实体中生成查询搜索,从而创建一个超过 65000 个字符的非常大的查询

qGetByKey = CompiledQuery.Compile<EntitiesContext, Guid, Table>((context, key) => context.AllTables.FirstOrDefault(AT =>
AT.id.Equals(key)));

有什么建议吗?

【问题讨论】:

  • 这能回答你的问题吗? SQL: Error, Expression services limit reached?
  • 不,我之前看到过这个问题,但我不知道实体框架创建连接所有表的选择的方式
  • 你会的。查询 entities 是您自己的代码。像 EF Core 这样的 ORM 处理的是 entities 而不是表。没有 JOIN,表之间有预先配置的关系。 DbContext 不是数据库模型或数据库连接,它包含特定用例中使用的实体。 client 代码创建被翻译成 SQL 的查询。如果您的代码使用过于复杂的查询,则可能无法将其转换为 SQL
  • 您能告诉我们您的查询吗?
  • qGetByKey = CompiledQuery.Compile( (context, key) => context.AllTables.FirstOrDefault(AT => AT.id.Equals(key)));跨度>

标签: c# sql-server entity-framework


【解决方案1】:

当性能至关重要或需要更好的控制时,使用 EF 总是会遇到问题。

在尝试了几个选项后,我意识到解决我的问题的独特选项是:

  • 删除我不再使用的表。

  • 创建一个方法,对独立构成实体集的每个实体进行查询。此解决方案提高了查询的性能。

  • 在这种情况下使用 microORM 作为 Dapper,另一个关键点需要更好的性能,为系统的其余部分维护 EF。 (这个是我最喜欢的)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-05
    • 1970-01-01
    • 1970-01-01
    • 2011-11-26
    • 2011-03-04
    • 1970-01-01
    相关资源
    最近更新 更多