sql - 使用 EF 和 Oracle 表的 LINQ 查询非常慢

标签 sql .net oracle linq entity-framework

我有一个使用 EF4 的 MVC3 应用程序,访问 Oracle 后端。我在访问带有链接的表之一时遇到了一个奇怪的问题。该表称为 EXPENSES,它有一个称为 PK 的标识列(类型:NUMBER)。尽管有它的名字,PK 列实际上并不是主键——它只是有一个唯一索引。

当我对此表执行 LINQ 查询时,速度非常慢,甚至返回 < 100 条记录。这是查询:

List results = dataContext.EXPENSE.Where(x => x.PROJECT_ID == trgProjectID).ToList();

我查看了它发送到数据库的原始 SQL(使用 ToTraceString),并且 SQL 本身运行得非常快(不到 2 秒)。

请注意,我的查询不包含 PK 列本身。但是,PROJECT_ID 列也有一个索引(在本例中为非唯一索引)。

奇怪的是,如果我“破解”查询,以便在Where语句中也过滤PK(基本上,我将PK值硬编码到其中,只是为了看看会发生什么),查询会很快完成。

我猜测这个问题与 EF 层内的 key 解析有关。我尝试将费用 DBSet 上的 MergeOption 更改为“NoTracking”,但这没有效果。

任何想法将不胜感激......!

最佳答案

.AsNoTracking()方法可能有助于提高查询的性能 - 这意味着 Entity Framework 不会尝试跟踪实体的任何更改。

List results = dataContext.EXPENSE
                          .AsNoTracking()
                          .Where(x => x.PROJECT_ID == trgProjectID)
                          .ToList();

如果您不需要跟踪对实体所做的更改,则应使用此代码 - 例如您正在加载要在网格中显示的实体。

推荐阅读:

Entity Framework and AsNoTracking

关于sql - 使用 EF 和 Oracle 表的 LINQ 查询非常慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20497037/

相关文章:

sql - 使用数据类型是 postgresql SET 语句

sql - Oracle Sql中 "!="和 "<>"有什么区别吗?

sql - 如何选择多列,其中只有一列不同? (甲骨文数据库)

oracle - 带有 oracle 12c 的 Windows 的 Docker 镜像

sql - 如何在oracle SQL表中插入法国数字格式

sql - 如何在不使用 if 语句的情况下重写它?

sql - MySQL View - 何时使用和何时不使用

c# - 是否可以从 .NET 核心在 linux 平台上调用共享库 (.so)?

C# 3.5 合并 2 个不同类型的列表

c# - 如何创建自时间触发功能?