我想找到使用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的不钻研匿名类型select语句设置的方式。
我试图做一些的调整:
query.GroupJoin(discquqery,
x => x.ID,
x => x.Event.ID,
(evt, disc) => evt.Discussions = disc.Where(actingUser.GenerateSecurityFilterFor<Domain.Discussion>())).ToList();
然而,你不能有一个lambda表达式内部分配和选择这里的匿名类型引起,它并使用选择同样的困境。
我想我无法理解为什么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,专家交换等,请意识到这不是一个重复。 任何接触,甚至在这个问题上要么有虎头蛇尾“这不能做”的答案或无人接听的。 没有什么是不可能的......包括这一点。