gpt4 book ai didi

c# - Entity Framework 5 过滤并包含导航属性

转载 作者:可可西里 更新时间:2023-11-01 07:47:27 26 4
gpt4 key购买 nike

我想找到一种使用 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();

但是,您不能在 lambda 表达式中进行赋值,并且在此处选择匿名类型会导致与使用 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:我已经搜索过stack、MSDN、experts-exchange等。请注意这不是重复的。甚至涉及到这个主题的任何事情要么有一个逃避“它无法完成”的答案,要么根本没有答案。没有什么是不可能的......包括这个。

最佳答案

Anything even touching on this subject either has a cop-out "It can't be done" answer or no answer at all. Nothing is impossible... including this.

当然。有可能的。您可以下载 EF 源代码并自行添加此功能。这将对开源项目和社区做出巨大贡献。我相信 EF 团队会很乐意为您提供帮助。

当前版本“无法完成”is the answer .您可以使用投影到匿名或特殊未映射类型,如您在问题开头所述。其他选项是单独的显式查询以加载单父项的相关实体或单独的查询以加载所有父项的相关实体。

单亲加载关系:

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

所有 parent 的加载关系(需要关闭延迟加载):

// 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 应该会自动修复您在父实体中的关系(集合)(但它不会将动态代理中的集合标记为已加载,因此您不能将其与延迟加载一起使用)。

关于c# - Entity Framework 5 过滤并包含导航属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14740121/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com