我对带有EF1的LINQ to Entities查询有一个非常奇怪的问题。
我有一个带有简单查询的方法:
public DateTime GetLastSuccessfulRun(string job)
{
var entities = GetEntities();
var query = from jr in entities.JOBRUNS
where jr.JOB_NAME == job && jr.JOB_INFO == "SUCCESS"
orderby jr.JOB_END descending
select jr.JOB_END;
var result = query.ToList().FirstOrDefault();
return result.HasValue ? result.Value : default(DateTime);
}
方法
GetEntities
返回从System.Data.Objects.ObjectContext
派生的类的实例,该类的实例在我导入数据库的架构时由EF设计器自动创建。该查询在过去15或16个月内运行良好。而且它在我们的测试系统上仍然可以正常运行。但是,在实时系统中,存在一个奇怪的问题:根据参数
job
的值,尽管有应返回的数据,但它返回正确的结果或空结果集。有人遇到过这样奇怪的情况吗?任何想法可能是什么问题?
更多信息:
我们查询的数据库是Oracle 10g,我们使用的是OracleEFProvider v0.2a的增强版本。
当直接通过SQL Developer执行时,由
ToTraceString
返回的SQl语句可以很好地工作,即使使用与导致LINQ查询中问题相同的参数也是如此。以下还返回正确的结果:
entities.JOBRUNS.ToList().Where(x => x.JOB_NAME == job && x.JOB_INFO == "SUCCESS").Count();
此处的区别是应用where子句之前在表上对
ToList
的调用。这意味着两件事:数据在数据库中,并且是正确的。
问题似乎是由EF提供程序执行时包含where子句的查询。
真正令我惊讶的是,这是一个实时系统,问题发生了,没有对数据库或程序进行任何更改。对该方法的一次调用返回了正确的结果,五分钟后的下一次调用返回了错误的结果。从那以后,它只会返回错误的结果。
欢迎任何提示,建议,想法等,没关系,它们看起来有多牵强!请张贴它们作为答案,以便我可以对它们进行投票,这是为了阅读我冗长的问题并为这个奇怪的问题而烦恼的事实... ;-)
最佳答案
首先删除ObjectContext
缓存。对象上下文内部使用UnitOfWork and IdentityMap模式。这会对查询产生重大影响。