【发布时间】:2020-06-14 12:05:29
【问题描述】:
这是我的模型
class Parent
{
int Id;
string Name;
List<Child> Childs;
} // name is unique
class Child
{
int Id;
int ParentId;
string Name;
Parent Parent;
} // couple (id, name) is unique
对于给定的夫妻列表(父母姓名,孩子姓名),我想获得夫妻(父母,孩子),其中孩子可以为空,如果具有给定名称的父级存在,但子级不存在。 SQL 查询如下所示:
SELECT *
FROM parents p
LEFT JOIN childs c ON c.parent_id = p.id
WHERE p.name = 'parent1' AND (c.name IS NULL OR c.name = 'child1')
OR p.name = 'parent2' AND (c.name IS NULL OR c.name = 'child2')
OR p.name = 'parent3' AND (c.name IS NULL OR c.name = 'child3')
OR p.name = 'parent4' AND (c.name IS NULL OR c.name = 'child4');
我尝试在 Entity Framework Core 中使用 PredicateBuilder 的 Or 和 False 方法来表达这个查询
var predicate = PredicateBuilder.False<Parent>()
.Or(p => p.Name == "parent1" && p.Childs.Any(c => c.Name == "child1"))
.Or(p => p.Name == "parent2" && p.Childs.Any(c => c.Name == "child2"))
.Or(p => p.Name == "parent3" && p.Childs.Any(c => c.Name == "child3"))
.Or(p => p.Name == "parent4" && p.Childs.Any(c => c.Name == "child4"));
var p = await _db.Parents
.Include(p => p.Childs)
.Where(predicate)
.ToArrayAsync();
这是我能得到的最接近的结果,但这并没有得到预期的结果:
- 如果子级不存在,则父级不存在于结果集中
-
Parent.Childs包含父级的所有子级,而不仅仅是想要的子级
我的查询可以用 Entity Framework Core 表达吗?
【问题讨论】:
-
为什么 Child 有 ParentId 和 Parent?
-
父级是navigation property。 ParentId 是可选的,但我认为它不会改变问题。
-
但是看起来关系不好
-
您是否意识到这是一个非常不常见的查询:给我父母和唯一的给定名字的孩子,或者没有任何孩子的父母并跳过只有孩子的父母有其他名字。特别是。最后一部分似乎不常见。这是故意的吗?
-
好的,也就是说如果
parent1有两个孩子child11和child12,它就不会出现在列表中。
标签: c# sql entity-framework-core