我有一个使用 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();
如果您不需要跟踪对实体所做的更改,则应使用此代码 - 例如您正在加载要在网格中显示的实体。
推荐阅读:
关于sql - 使用 EF 和 Oracle 表的 LINQ 查询非常慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20497037/