相交所需的LINQ查询帮助

时间:2010-03-09 19:18:26

标签: linq-to-sql subquery

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?

提前致谢。

2 个答案:

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