【发布时间】:2025-12-02 03:40:01
【问题描述】:
我使用 EntityFramework Core 的数据库架构简化了这一点:
public class Parent
{
public int ID { get; set; }
}
public class Child
{
public int ID { get; set; }
public bool Include { get; set; }
}
public class Link
{
public int FromID { get; set; }
public int ToID { get; set; }
}
父项通过第三个表中的条目链接到子项。 父链接是一对多的 与孩子的链接是一对一的
作为这项工作的一部分,我无法更改数据库架构。
我正在尝试返回与至少一个孩子相关联且所有孩子都满足特定条件的 Parent 实例(在此示例中为 include == true)
我尝试了很多不同的查询,包括下面的一个,它在这个测试场景中有效,但似乎不能很好地扩展。
var ParentList = new[]
{
new Parent {ID = 1}, //3 children, 1 fails criteria
new Parent {ID = 2}, //2 children, all pass criteria
new Parent {ID = 3} //no children
};
var ChildList = new[]
{
new Child {ID = 11, Include = true},
new Child {ID = 12, Include = true},
new Child {ID = 13, Include = false},
new Child {ID = 21, Include = true},
new Child {ID = 22, Include = true},
};
var LinkList = new[]
{
new Link {FromID = 1, ToID = 11},
new Link {FromID = 1, ToID = 12},
new Link {FromID = 1, ToID = 13},
new Link {FromID = 2, ToID = 21},
new Link {FromID = 2, ToID = 22},
};
var relevant = (from parent in ParentList
join l in LinkList on parent.ID equals l.FromID into links
from linkedChildren in (
from link in links
join child in ChildList on link.ToID equals child.ID into children
from child in children
group child by link.FromID into kids
select kids.AsEnumerable())
where linkedChildren.All(x => x.Include)
select new { parent, linkedChildren }).ToList();
Assert.Single(relevant);
Assert.Equal(2, relevant.First().parent.ID);
【问题讨论】:
标签: c# entity-framework linq entity-framework-core linq-to-entities