2015-11-17 2 views
1

У меня есть набор коллекций, построенный таким образом, что каждый объект в коллекции «children» (possible_child) должен по крайней мере иметь родительский родительский набор (возможно_parent). Я хотел бы обнаружить тех детей, у которых нет родительского объекта. В качестве примера, если я найду ребенка с заданной страной, годом, сезоном и сезонным типом, не должно быть, по крайней мере, родительская запись с теми же данными.Найти объекты с объектами, не содержащими родительские объекты, используя LINQ

Я написал следующий запрос, который я сейчас вижу неправильно.

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
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)); 
+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))); 
+0

правильный и я выбрал одно из рабочих решений. Я бы тоже выбрал этот. Многие thnaks –

1

Вы можете использовать Где и любой, чтобы достичь своей цели.

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

Это может улучшить читаемость вашего запроса.

+0

true. Хороший код –

Смежные вопросы