#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 запроса последовательно в этом порядке в одном и том же контексте:
- запрос старой школы
- новый школьный запрос
В этом случае второй запрос (новая школа) возвращает все устройства, он не фильтрует mac-адрес «112233445566». Я не могу понять, ошибка это или что-то еще…
Комментарии:
1. Возможно, вы не будете ждать достаточно долго, чтобы получить MAC. Попробуйте изменить порядок запросов и посмотреть, что произойдет.
2.
.Include(a => a.AccountDevices)
— контекст теперь содержит все устройства для этой учетной записи, если я не ошибаюсь3. Переключение порядка запросов заставляет его работать. Выполнение запросов по отдельности заставляет его работать. Выполнение в таком порядке приведет к тому, что второй запрос пойдет не так