使用LINQ查找子对象缺少父对象

时间:2015-11-17 11:36:41

标签: c# .net linq

我有一组以这样的方式构建的集合,即“children”(possible_child)集合中的每个对象至少应该具有父集合(possible_parent)的父对象。我想检测那些没有父对象的孩子。 例如,如果我找到一个具有给定国家,年份,季节和季节类型的孩子,那么至少应该有一个具有相同数据的父记录。

我写了以下查询,我现在看错了。

var childrenMissingParents = (from cl in possible_child
join pr in possible_parent on new
 {
   p1=cl.Country,
   p2=cl.Year,
   p3=cl.Season,
   p4=cl.SeasonType

  }

    equals
  new
  {
    p1=pr.Country,
    p2=pr.Year,
    p3=pr.Season,
    p4=pr.SeasonType
  }
into opr from spr in opr.DefaultIfEmpty()
where spr == null select cr).ToList();

有人可以提出更好的建议吗?

3 个答案:

答案 0 :(得分:3)

如果我理解正确,以下是您想要的:

var orphanedItems = possible_child
    .Where(item => !possible_parent.Any(p =>
        (p.Year == item.Year) &&
        (p.Country == item.Country) &&
        (p.Season== item.Season) &&
        (p.SeasonType == item.SeasonType)));

答案 1 :(得分:3)

var childrenMissingParents = possible_child.Where(
    c => !possible_parent.Any(
        p => p.Country == c.Country
     && p.Year == c.Year
     && p.Season == c.Season
     && p.SeasonType == c.SeasonType));

答案 2 :(得分:1)

您可以使用Where和Any来实现目标。

var childrenWithoutParent = possible_child.Where(child => !possible_parent.Any(p =>
                                                                   (p.Year == child.Year) &&
                                                                   (p.Country == child.Country) &&
                                                                   (p.Season == child.Season) &&
                                                                   (p.SeasonType == child.SeasonType)));

但是,您可以更多地改进代码的读取,您可以在您的孩子中使用一种方法与父母进行比较:

public class Child
    {
        ....

        public bool IsEqualsTo(Parent parent)
        {
            return (this.Year == parent.Year) &&
                   (this.Country == parent.Country) &&
                   (this.Season == parent.Season) &&
                   (this.SeasonType == parent.SeasonType)));
        }
    }

这可以提高查询的可读性。

  var childrenWithoutParent = possible_child
                                    .Where(child => !possible_parent.Any(p => child.IsEqualsTo(p));