Я хотел бы найти способ использования Linq для фильтрации свойства навигации для подмножества связанных объектов. Я знаю, что все ответы по этому вопросу предлагают сделать анонимный селектор, например:
query.Where(x => x.Users.Any(y => y.ID == actingUser.ID))
.Select(x => new
{
Event = x,
Discussions = x.Discussions.Where(actingUser.GenerateSecurityFilterFor<Domain.Discussion>())
})
.OrderBy(x => x.Discussions.Count())
.ThenBy(x => x.Event.Name);
Однако это значительно меньше идеального из-за общей природы генерации запросов, а также дает значительно ужасные SQL-запросы, если вы выкидываете профилировщик.
Я хотел бы иметь возможность выполнить что-то вроде:
query.Include(x => x.Discussions.Where(actingUser.GenerateSecurityFilterFor<Domain.Discussion>()))
.OrderBy(x => x.Discussions.Count())
.ThenBy(x => x.Name);
Я понимаю, что это не поддерживается в EF5 (или любой версии, если на то пошло), но должен быть способ добиться ограничения набора результатов через Linq, не вникая в утверждения анонимного типа.
Я попытался сделать что-то под мелодию:
query.GroupJoin(discquqery,
x => x.ID,
x => x.Event.ID,
(evt, disc) => evt.Discussions = disc.Where(actingUser.GenerateSecurityFilterFor<Domain.Discussion>())).ToList();
Однако вы не можете иметь назначение внутри выражения лямбда и выбор анонимного типа здесь вызывает ту же дилемму, что и при использовании select.
Я думаю, я не могу понять, почему EF не предоставляет способ (который я могу найти) для генерации:
SELECT
--Properties
FROM Event e
LEFT OUTER JOIN Discussions d
ON e.ID = d.EventID AND --Additional constraints
WHERE
--Where conditions
ORDER BY
--Order Conditions
Так просто ограничить соединение в SQL там, чтобы быть способом сделать это через Linq, а также.
PS: Я искал стек, MSDN, обмен экспертами и т.д. Пожалуйста, поймите, что это не дубликат. Все, что касается даже этой темы, либо имеет ответ "Это не может быть сделано", либо ответ вообще. Нет ничего невозможного... включая это.