2

需要在实体框架中选择数据,但需要过滤子孙

我有 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 

它不能是匿名类型,因为我需要更新数据并将saveChanges 保存到数据库。

使用 vs 2010 和 EF 4.0

4

3 回答 3

2

使用 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;
于 2013-01-25T15:26:42.867 回答
1

这个查询应该做你想做的事。是的,它有点乱,因为它嵌套得太深了。

var result = context.Parent
                    .Where(parent => parent.Child
                                           .Any(child => (child.Column5 == 600) &&
                                                          child.GrandChild
                                                               .Any(grandchild => grandchild.GreatGrandChild
                                                                                            .Any(greatgrandchild => greatgrandchild.Column3 == 1000))));
于 2013-01-25T16:24:05.643 回答
0

你的表结构——如果你的例子不仅仅是为了说明,让我认为你可能想在这里更多地考虑你的模型(即孩子是独立的实体类型还是应该是定义的关系?)

您描述的是一个简单的连接和 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() 以防止往返直到最后一次通话吗?

于 2013-01-25T15:35:15.133 回答