LINQ大师,我正在寻求帮助来编写查询...
我有一个包含Person记录的表,并且它有一个可空的ParentID列,因此它是一种自引用,其中每条记录可能都有一个Parent。
我正在寻找处理父行的未处理行。 这个SQL工作正常:
SELECT *
FROM Person
where IsProcessed = 0 and
ParentId in
(
select Id from Person
where IsProcessed = 1
)
我尝试了很多LINQ查询,但是他们失败了。现在,我正在尝试:
var qParent =
from parent in db.Person
where
parent.IsProcessed == true
select parent.ID;
var qChildren = from child in db.Person
where
child.IsProcessed == false
&& child.ParentId.HasValue
select child.ParentId.Value;
var q2 = qChildren.Intersect(qParent);
由于某种原因,这会产生带有DISTINCT子句的SQL,我很困惑为什么会生成DISTINCT。
我的主要问题是如何为上面的SQL语句编写LINQ?
提前致谢。
答案 0 :(得分:3)
Intersect是 set 操作 - 它意味着从交集返回一组不同的元素。我认为它会在SQL中使用DISTINCT似乎是合理的。可能有多个孩子拥有相同的父级,例如 - Intersect
应该只返回该ID一次。
你有什么理由不想在这里使用连接吗?
var query = from parent in db.Person
where parent.IsProcessed
join child in db.Person.Where(child => !child.IsProcessed)
on parent.ID equals child.ParentId.Value
select child;
答案 1 :(得分:0)
查询可以按字面翻译成:
var parentIds = db.Person.Where(x => x.IsProcessed)
.Select(x => x.Id)
.ToList();
var result = db.Person.Where(x => !x.IsProcessed && parentIds.Contains(x => x.Id))
.ToList();