实体框架.需要帮助筛选结果
本文关键字:筛选 结果 帮助 框架 实体 | 更新日期: 2023-09-27 17:55:55
需要在实体框架中选择数据,但需要筛选子项和子项
我有4张桌子。 Parent -> Child -> GrandChild -> GreatGrandChild
我想归还所有的父母,但过滤孩子和曾孙。
换句话说(例如)
SELECT Parent.*
FROM Parent
INNER JOIN Child
INNER JOIN Grandchild
INNER JOIN GreatGrandChild
WHERE child.Column5 = 600 AND
GreatGrandChild.Column3 = 1000
它不能是异常类型,因为我需要更新数据并将更改保存到数据库。
使用 vs 2010 和 EF 4.0
使用 linq,你应该需要这样的东西。
var q = from q1 in dbContext.Parent
join q2 in dbContext.Children
on q1.key equals q2.fkey
join q3 in ........
where q4.col1 == 3000
select q1;
此查询应执行所需的操作。是的,它有点混乱,因为它嵌套得太深了。
var result = context.Parent
.Where(parent => parent.Child
.Any(child => (child.Column5 == 600) &&
child.GrandChild
.Any(grandchild => grandchild.GreatGrandChild
.Any(greatgrandchild => greatgrandchild.Column3 == 1000))));
您的表结构 - 如果您的示例不仅仅是为了说明,那么我认为您可能想在这里更多地考虑您的模型(即子实体类型是单独的实体类型还是它们应该是定义的关系?
你描述的是一个简单的连接和where子句,并且基本上以相同的方式编写:假设你从DBContext返回DBSet:
_context.Parents.Join(context.Child, p=>p.Parent.ID, c=>c.ParentID)
.Join(...Grandchild...).Where(o=>o.Column5=600)
.Join(...GreatGrandChild...).Where(o=>o.Column3=1000)
编辑 若要取回强类型实体,您可能需要执行以下操作:
var greatgrandchildren = context.GreatGrandchildren.Where(o=>o.Column3=1000).ToList();
var grandchildren = context.Grandchildren.Where(o=>o.Column3=600 and greatgrandchildren.contains(o)).ToList();
var children = context.Children.Where(o=>grandchildren.Contains(o)).ToList();
var parents = context.Parent(o=>children.Contains(o).ToList();
我的语法可能关闭了,有人可以添加,我可以避免.ToList() 以防止在最后一次调用之前往返?