的EntityFramework 5滤波器所包括的导航属性(EntityFramework 5 fi

2019-07-19 11:53发布

我想找到使用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,专家交换等,请意识到这不是一个重复。 任何接触,甚至在这个问题上要么有虎头蛇尾“这不能做”的答案或无人接听的。 没有什么是不可能的......包括这一点。

Answer 1:

任何接触,甚至在这个问题上要么有虎头蛇尾“这不能做”的答案或无人接听的。 没有什么是不可能的......包括这一点。

当然。 有可能的。 您可以下载EF源代码,添加此功能自己。 这将是很大的贡献开源项目和社区。 我相信EF团队会很乐意帮助你的努力。

当前版本“不能做” 就是答案 。 您可以使用投影匿名或特殊映射的类型,你在你的问题的开头所描述。 其他选项是加载单亲或单独的查询来加载相关实体对所有父母相关实体的独立明确的查询。

单亲负载的关系:

context.Entry(event)
       .Collection(e => e.Discussions)
       .Query()
       .Where(d => ...)
       .Load();

所有的家长负载关系(需要延迟加载被关闭):

// load all parents
var events = query.Where(e => ...).ToList();

// load child filtered by same condition for parents and new condition for children
childQuery.Where(d => e.Event ... && d.Something ...).Load();

第二种方法则需要孩子有导航属性回父(构建最初用于负载父母相同的查询条件)。 如果你拥有了一切正确配置和实体连接EF应自动修复你的父实体的关系(集合)(但加载所以这就是为什么你不能延迟加载一起使用的原因,它不会在动态代理标记集合)。



文章来源: EntityFramework 5 filter an included navigation property