Почему ядро EF неправильно фильтрует при последующем запросе?

#c# #entity-framework #.net-5

#c# #entity-framework #.net-5

Вопрос:

Я не могу найти подходящее название для вопроса, советы приветствуются…

Я работаю над ядром EF в проекте net5.0. Таблиц 4: учетная запись, устройство учетной записи, устройство, шлюз. Схема базы данных: [Account] --(1,n)--> [AccountDevice] --(1,n)--> [Device] --(1,1)--> [Gateway]

В Device таблице есть столбец навигации GatewayMacAddress .

Этот запрос работает нормально:

  var account = await context.Account.Where(a => a.Id == 1)
                .Include(a => a.AccountDevices.Where(ad => ad.Device.GatewayMacAddress == "112233445566"))
                .ThenInclude(ad => ad.Device)
                .ThenInclude(d => d.Gateway)
                .FirstOrDefaultAsync();
 

Приведенный выше запрос отфильтровывает все устройства с mac-адресом шлюза «112233445566». Он использует функцию EF Core 5 where-in-include.

Если я выполняю запрос «старой школы», для старой школы я имею в виду без функции where-in-include:

 var ac = await context.Account.Where(a => a.Id == 1)
                .Include(a => a.AccountDevices)
                .ThenInclude(ad => ad.Device)
                .ThenInclude(d => d.Gateway)
                .Select(a => new
                {
                    Account = a,
                    AccountDevices = a.AccountDevices.Where(ad => ad.Device.GatewayMacAddress == "112233445566")
                })
                .FirstOrDefaultAsync();
 

он также работает, отфильтровывая устройство с mac-адресом «112233445566».

Проблема возникает, если я выполняю 2 запроса последовательно в этом порядке в одном и том же контексте:

  1. запрос старой школы
  2. новый школьный запрос

В этом случае второй запрос (новая школа) возвращает все устройства, он не фильтрует mac-адрес «112233445566». Я не могу понять, ошибка это или что-то еще…

Комментарии:

1. Возможно, вы не будете ждать достаточно долго, чтобы получить MAC. Попробуйте изменить порядок запросов и посмотреть, что произойдет.

2. .Include(a => a.AccountDevices) — контекст теперь содержит все устройства для этой учетной записи, если я не ошибаюсь

3. Переключение порядка запросов заставляет его работать. Выполнение запросов по отдельности заставляет его работать. Выполнение в таком порядке приведет к тому, что второй запрос пойдет не так