Как это?
User user = ...;
IEnumerable<Securable> securablesForUser =
user.Roles.SelectMany(x => x.Securables).Distinct();
Обновление: -
После работы над проектом, где это было действительно узким местом производительности, я исследовал более глубоко и обнаружил, чтоследующий запрос LINQ генерирует лучший SQL (для наших данных): -
IEnumerable<Securable> securablesForUser =
context.Users.Where(x => x.UserId == userId)
.SelectMany(x => x.Roles)
.SelectMany(x => x.Securables)
.Distinct();
Это будет использовать INNER JOIN
в переведенном SQL-запросе: -
IEnumerable<Securable> securablesForUser = context.Securables.Where(
x => x.Roles.Any(y => y.Users.Any(z => z.UserId == userId))).Distinct();
использует WHERE EXISTS
который в нашем тесте был медленнее , чем запрос дважды.
Как всегда, если у вас есть проблемы с производительностью, я рекомендую профилирование.Результаты с вашими данными могут отличаться. Если вам не достаточно профилирования, вам не достаточно оптимизировать!