2011-01-14 2 views
2

Посылки является спискомКак LINQ.FOREACH для доступа к родителю

каждого пакет имеет Владелец свойство, содержащее Перечислите

parcels.Where(p => !p.Owners.IsNullOrEmpty()).SelectMany(p => p.Owners) 
        .OrderByDescending(x => x.RecordingDate ?? x.SaleDate ?? x.DateEntered) 
        .ForEach(owner => 
        { 
        /* HERE I need to access to p which was a parent of this Owner */ 
        } 

Не знаю, как переписать его ...

+0

... и я предполагаю, что 'Owner' не бывает, чтобы иметь' свойство Parent'? –

+0

wait, вы имеете в виду, что вам нужно получить доступ к p, который был * ребенком * этого владельца? Вы уже обращаетесь к родителям в первой части запроса, так почему это было бы иначе, если бы еще больше родителей продолжали свою иерархию? –

+0

Владелец не имеет родительского свойства ... У меня есть гибкость, чтобы добавить его, чтобы я мог это сделать. (p не является дочерним элементом владельца, p является исходным родителем ...) – Chris

ответ

3

сделать анонимное пару для повторения.

foreach(var pair in parcels 
    .Where(p => p.Owners != null) 
    .SelectMany(p => new { o = p.Owners, p }) 
    .OrderByDescending(x => x.o.RecordingDate ?? x.o.SaleDate ?? x.o.DateEntered)) { 

    var owner = pair.o; 
    var parcel = pair.p; 

    // do stuff 
} 
// alternate syntax 
foreach(var pair in from p in parcels 
        where p.Owners != null 
        from o in p.Owners 
        orderby o.RecordingDate ?? o.SaleDate ?? o.DateEntered descending 
        select new { o, p }) { 
    var owner = pair.o; 
    var parcel = pair.p; 
    // do stuff 
} 
+0

Спасибо, альтернативный синтаксис работал для меня. – Chris

0

Вам нужно добавить посылку пункта, возвращенного SelectMany:

parcels 
     .Where(p => !p.Owners.IsNullOrEmpty()) 
     .SelectMany(p => p.Owners.Select(o => new { Parcel = p, Owner = o })) 
     .OrderByDescending(x => x.Owner.RecordingDate ?? x.Owner.SaleDate ?? x.Owner.DateEntered) 
     .ForEach(item => 
     { 
      Parcel p = item.Parcel; 
      Owner o = item.Owner; 
      ... 
     } 
+0

Это также работает, спасибо. – Chris