使用EF和Oracle Table的LINQ查询非常慢

时间:2013-12-10 14:26:08

标签: 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列上还有一个索引(在这种情况下是一个非唯一索引)。

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

我猜这个问题与EF层内的Key分辨率有关。我尝试将费用DBSet上的MergeOption更改为" NoTracking"但这没有效果。

任何想法都会受到赞赏......!

1 个答案:

答案 0 :(得分:2)

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

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

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

推荐阅读:

Entity Framework and AsNoTracking