Я рад, что вы определили свои многие-ко-многим как две виртуальные коллекции без указания таблицы соединений!
Вы понимаете, что если вы не получите "группы со своими пользователями ", но вместо того, чтобы запрашивать левое внешнее объединение групп и пользователей (вы называете это плоским способом), свойства группы будут повторяться снова и снова для каждого пользователя?
Но эй, этоваше решение, и вы должны убедить своего руководителя проекта, что лучше передавать одни и те же свойства группы сто раз, а не передавать их только один раз.
Вы были правы для левого внешнего соединения,вам нужно сделать SelectMany
.Я не уверен, почему вы решили использовать Include
вместо Select
.
При запросе данных всегда используйте Выберите и выберите только те свойства, которые вы на самом деле планируетеиспользовать.Используйте Включить , только если вы планируете обновить извлеченные включенные данные.
Причина этого особенно значима в отношении «один ко многим».Если вы выбираете «Школы со своими учениками», а в Школе с идентификатором 4 - 1000 учеников, то вы знаете, что у каждого ученика этой школы будет внешний ключ со значением 4. Какая трата для передачи этого значения 4 более 1000 раз.!
Одна из перегрузок Enumerable.SelectMany имеет параметр resultSelector
, который примет один Group
и один User
в качестве входных данных для создания результата.Эта версия идеально подходит для ваших нужд
var result = dbContext.Groups.SelectMany(
group => group.Users,
(group, user) => new
{
// Select the Group properties you plan to use
GroupId = group.GroupId,
GroupName = group.Name,
...
// Select the User properties you plan to use
UserId = user.UserId,
UserName = user.DisplayName,
...
})
// if desired do some ordering
.OrderBy(joinedItem => joinedItem.GroupName);