LINQ to Entities: запрос не работает с определенным значением параметра - PullRequest
2 голосов
/ 28 февраля 2011

У меня очень странная проблема с запросом LINQ to Entities с EF1. У меня есть метод с простым запросом:

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, возвращаемый ToTraceString, прекрасно работает, когда выполняется непосредственно через SQL Developer, даже с тем же параметром, который вызывает проблему в запросе LINQ.
Следующее также возвращает правильный результат:

entities.JOBRUNS.ToList().Where(x => x.JOB_NAME == job && x.JOB_INFO == "SUCCESS").Count();

Разница здесь заключается в вызове ToList на столе перед применением предложения where. Это означает две вещи:

  1. Данные в базе данных правильные.
  2. Кажется, что проблема заключается в запросе, включающем предложение where при выполнении провайдером EF.

Что меня действительно оглушает, так это то, что это живая система, и проблема возникла без каких-либо изменений в базе данных или программе. Один вызов этого метода вернул правильный результат, а следующий вызов через пять минут вернул неправильный результат. И с тех пор это только возвращает неправильные результаты.

Любые намеки, предложения, идеи и т. Д. Приветствуются, не говоря уже о том, насколько надуманными они кажутся! Пожалуйста, опубликуйте их как ответы, чтобы я мог голосовать за них, просто за то, что прочитал мой длинный вопрос и потрудился подумать об этой странной проблеме ...;

1 Ответ

2 голосов
/ 28 февраля 2011

Прежде всего удалите ObjectContext кеширование.Внутренний контекст объекта использует шаблоны UnitOfWork и IdentityMap .Это может оказать большое влияние на запросы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...