【问题标题】:Very slow LINQ query using EF and Oracle Table使用 EF 和 Oracle 表的非常慢的 LINQ 查询
【发布时间】:2013-12-28 02:54:57
【问题描述】:

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

当我对该表执行 LINQ 查询时,它非常慢,甚至返回 列出结果 = dataContext.EXPENSE.Where(x => x.PROJECT_ID == trgProjectID).ToList();

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

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

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

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

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

【问题讨论】:

  • 项目id和trgProject ID是同一类型吗?也许你可以做两个查询的练习,看看执行计划,这可以给你更多关于 sql server 发生了什么的信息

标签: sql .net oracle linq entity-framework


【解决方案1】:

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

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

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

推荐阅读:

Entity Framework and AsNoTracking

【讨论】:

    猜你喜欢
    • 2014-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-19
    • 2020-04-04
    • 2014-06-01
    • 2012-06-28
    • 1970-01-01
    相关资源
    最近更新 更多