C# LINQ到实体:查询不使用某些参数值

C# LINQ到实体:查询不使用某些参数值,c#,oracle,entity-framework,C#,Oracle,Entity Framework,使用EF1进行LINQ到实体查询时,我遇到了一个非常奇怪的问题。 我有一个简单查询的方法: public DateTime GetLastSuccessfulRun(string job) { var entities = GetEntities(); var query = from jr in entities.JOBRUNS where jr.JOB_NAME == job && jr.JOB_INFO == "SUCCESS

使用EF1进行LINQ到实体查询时,我遇到了一个非常奇怪的问题。 我有一个简单查询的方法:

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个月里,这个查询运行得很好。它在我们的测试系统上仍然运行良好。然而,在实时系统中,有一个奇怪的问题:根据参数
作业
的值,它返回正确的结果或空的结果集,尽管它应该返回数据。
有人有过这样奇怪的病例吗?你知道有什么问题吗

更多信息:
我们查询的数据库是Oracle 10g,我们使用的是的增强版。
当直接通过SQl Developer执行时,
ToTraceString
返回的SQl语句工作正常,即使使用导致LINQ查询中出现问题的相同参数也是如此。
以下内容还会返回正确的结果:

entities.JOBRUNS.ToList().Where(x => x.JOB_NAME == job && x.JOB_INFO == "SUCCESS").Count();
这里的区别是在应用where子句之前调用表上的
ToList
。这意味着两件事:

  • 数据在数据库中,并且是正确的
  • 问题似乎是由EF提供者执行时包含where子句的查询
  • 真正让我震惊的是,这是一个实时系统,问题发生时没有对数据库或程序进行任何更改。对该方法的一次调用返回了正确的结果,五分钟后的下一次调用返回了错误的结果。从那以后,它只会返回错误的结果


    任何提示、建议、想法等都是受欢迎的,不管它们看起来多么牵强!请把它们作为答案贴出来,这样我就可以对它们进行投票了,这是因为我读了我冗长的问题,并且费心思考那个奇怪的问题……;-)

    首先删除
    ObjectContext
    缓存。对象上下文在内部使用模式。这可能会对查询产生很大影响。

    这很可能与您的问题无关,但您可以运行:
    var result=query.FirstOrDefault()它将从数据库返回单个项,您的查询将返回所有可用的结果,然后在内存中选择first.Btw。您是使用新的上下文实例还是重用现有实例?@Ladislav Mrnka:的确,中间的
    ToList
    是不必要的,但您是对的:这不是问题所在:(@Ladislav Mrnka:大多数情况下,我都会重复使用它们。我实现了一种缓存15分钟的机制。谢谢你的建议。不幸的是,我不能再改变它了。我不记得引入它的原因,但我认为它与性能有关。你认为这就是导致该漏洞的原因吗?我不明白,它应该如何解决这个问题ld会导致我描述的问题。这不一定是原因,但它可以。您已经验证了该查询本身(生成的SQL)有效。因此,问题在于从SQL到对象的具体化结果。具体化取决于
    ObjectContext
    的当前状态。您可以尝试强制
    ObjectContext
    始终从DB加载数据-使用
    ObjectQuery
    并将其
    MergeOption
    设置为
    OverwriteChanges
    。这已经完成设置。问题不在于数据丢失。如果我请求整个表,然后在应用程序的内存中进行筛选,我会得到我想要的结果。目前,我认为问题在于使用了错误的参数类型。我们过去在不同的数值类型上遇到过类似的奇怪问题。看起来像Oracle中的错误。@Daniel:那么这可能是Oracle provider的问题。如果您对它有任何支持,您应该与他们联系。但首先,您应该确保当L2E查询执行错误时,Oracle不会返回任何数据。