Linq to sql Intersect需要LINQ查询帮助

Linq to sql Intersect需要LINQ查询帮助,linq-to-sql,subquery,Linq To Sql,Subquery,LINQ大师,我正在寻找帮助来编写查询 我有一个包含Person记录的表,它有一个可为空的ParentID列,因此它是一种自引用,其中每个记录可能有一个父记录 我正在查找父行已处理的未处理行。 此SQL工作正常: SELECT * FROM Person where IsProcessed = 0 and ParentId in ( select Id from Person where IsProcessed = 1 ) 我尝试了许多LINQ查询,但都失败了。现

LINQ大师,我正在寻找帮助来编写查询

我有一个包含Person记录的表,它有一个可为空的ParentID列,因此它是一种自引用,其中每个记录可能有一个父记录

我正在查找父行已处理的未处理行。 此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

提前感谢。

交集是一个集合操作-它意味着从交集返回一组不同的元素。在我看来,在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;
Intersect是一个集合操作——它意味着从交点返回一组不同的元素。在我看来,在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;

查询可以逐字翻译为:

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();

查询可以逐字翻译为:

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();

是的,我同意加入是最好的选择。我把它转了一圈,使它更符合逻辑,以便在db.Person where中读取:var q=from child!child.IsProcessed连接数据库中的父项。child.ParentID.value上的Person等于parent.ID,其中parent.IsProcessed选择子项;非常感谢,Jonyes,我同意加入是一种方式。我把它转了一圈,使它更符合逻辑,以便在db.Person where中读取:var q=from child!child.IsProcessed连接数据库中的父项。child.ParentID.value上的Person等于parent.ID,其中parent.IsProcessed选择子项;非常感谢,Jon非常感谢Obalix。您的查询也可以工作,但由于父toList()op的原因,可能不如联接的效率,也可能不是。我将语法错误修复为:parentId.Contains(x.Id.value)删除repeat x=>。嗯,没有太多。父查询执行一次(仅包含ID),然后将其放入Linq to SQL并成为
SELECT。。。从…起其中(1、2、3…)中的isprocessed=0&&id
。这执行得相当快,但显然您也使用了join解决方案。谁敢打败乔恩·斯基特?别忘了接受你满意的答案。非常感谢奥巴马。您的查询也可以工作,但由于父toList()op的原因,可能不如联接的效率,也可能不是。我将语法错误修复为:parentId.Contains(x.Id.value)删除repeat x=>。嗯,没有太多。父查询执行一次(仅包含ID),然后将其放入Linq to SQL并成为
SELECT。。。从…起其中(1、2、3…)中的isprocessed=0&&id
。这执行得相当快,但显然您也使用了join解决方案。谁敢打败乔恩·斯基特?别忘了接受你满意的答案。