Vul*_*ary 15 c# linq entity-framework-5
我想找到一种方法使用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);
Run Code Online (Sandbox Code Playgroud)
但是,由于我们的查询生成的一般性质,这显然不太理想,如果你抛出探查器,也会产生非常可怕的SQL查询.
我希望能够完成以下事情:
query.Include(x => x.Discussions.Where(actingUser.GenerateSecurityFilterFor<Domain.Discussion>()))
.OrderBy(x => x.Discussions.Count())
.ThenBy(x => x.Name);
Run Code Online (Sandbox Code Playgroud)
我知道这是不是在EF5(或与此有关的任何版本)的支持,但必须有完成约束的结果通过LINQ的不钻研匿名类型select语句设置的方式.
我试图做一些事情:
query.GroupJoin(discquqery,
x => x.ID,
x => x.Event.ID,
(evt, disc) => evt.Discussions = disc.Where(actingUser.GenerateSecurityFilterFor<Domain.Discussion>())).ToList();
Run Code Online (Sandbox Code Playgroud)
但是,您无法在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
Run Code Online (Sandbox Code Playgroud)
在SQL中约束连接是如此简单,HAS也是通过Linq实现它的一种方式.
PS:我已经搜索了堆栈,MSDN,专家交流等.请认识到这不是重复.甚至触及这个问题的任何一个都有一个警告"它无法完成"的答案或根本没有答案.没有什么是不可能的......包括这个.
甚至触及这个问题的任何一个都有一个警告"它无法完成"的答案或根本没有答案.没有什么是不可能的......包括这个.
当然.有可能的.您可以下载EF源代码并自行添加此功能.这将对开源项目和社区做出巨大贡献.我相信EF团队很乐意帮助您.
目前的版本"无法完成" 就是答案.您可以使用投影到匿名或特殊的未映射类型,如您在问题开头所述.其他选项是单独的显式查询,用于为单个父项加载相关实体,或者为所有父项加载相关实体.
单亲的负载关系:
context.Entry(event)
.Collection(e => e.Discussions)
.Query()
.Where(d => ...)
.Load();
Run Code Online (Sandbox Code Playgroud)
为所有父项加载关系(需要关闭延迟加载):
// 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();
Run Code Online (Sandbox Code Playgroud)
第二种解决方案要求child将导航属性返回给父级(用于构造最初用于加载父级的相同查询条件).如果您已正确配置所有内容并且附加了实体,则EF应自动修复父实体中的关系(集合)(但它不会将动态代理中的集合标记为已加载,因此这就是您不能将此与延迟加载一起使用的原因).
| 归档时间: |
|
| 查看次数: |
8555 次 |
| 最近记录: |