IQueryable возвращает противоречивые результаты - PullRequest
0 голосов
/ 22 января 2019

У меня относительно простой запрос, который возвращает противоречивые результаты.

Имея коллекцию идентификаторов (около 3300), я хочу запросить объекты, у которых есть дочерний элемент с этим идентификатором.Отношения между моими типами от 1 до n.Я делаю это партиями по 500 штук.

В моем тесте в анонимном типе в предложении Select у меня есть и ChildType, и ChildTypeId.Начиная с 5-го или 6-го пакета мой запрос возвращает неверные результаты.Пакеты запускаются последовательно.

Я использую .Net 4.6.1, EF6, DevArt 9.4.326 и Oracle 12c.

Я просто опубликую сводку моего кода.

Схема БД:

CREATE TABLE PARENT_TYPE
(
  "FK_CHLID_TYPE_ID" NUMBER(38,0) NOT NULL
)

CREATE TABLE CHILD_TYPE
(
  "ID" NUMBER(38,0) NOT NULL
)

Код C #:

public class ChildType
{
  public long Id { get; set; }
}

public class ParentType
{
  public ChildType ChildType { get; set; }
}

public void ProcessBatch(ISystemDataAccess dataAccess, long[] idsBatch)
{
  var queryResult = dataAccess.GetQuery<ParentType>()
                      .Where(p => idsBatch.Contains(p.ChildType.Id))
                      .Select(p => new
                      {
                        ChildId = p.ChildType.Id,
                        Child = p.ChildType,
                      }).ToList();

  if (queryResult.Any(qr => qr.ChildId != qr.Child.Id))
  {
    Debugger.Launch(); // will run in the 5th or 6th batch
  }
}

Во время 5-го или 6-го пакета будет запущен отладчик.

Некоторые замечания: Данные в БД являются согласованными и не приводят к неверным результатам.Ошибочные результаты находятся в свойстве Child анонимного типа и различаются для разных прогонов.ChildId в анонимном типе всегда как ожидалось.Если я использую определенный тип в предложении Select, проблема все равно возникает.

Кто-нибудь испытывал нечто подобное?Это вызвано EF или DevArt в сочетании с contains ()?Решением будет использование только идентификатора, но я хотел бы знать, что является причиной проблемы.

...