2012-06-04 11 views
5

ProsteOrderBy nadrzędna przedmiot przez zagnieżdżony Collection

public class TimeLine 
{ 
    public String Name {get;set} 
    public List<Milestone> MilesStones {get;set} 
} 

public class Milestone 
{ 
    public String Name {get;set} 
    public DateTime Time {get;set} 
} 

Próbowałem: from t in DataAccess.TimelineCollection.OrderBy(c=>c.MilesStones.OrderBy(z=>z.MilestoneDate)) select t; ale dostałem komunikat, że „co najmniej jeden obiekt musi implementować IComparable.”

Muszę zamówić TimeLine przez Milestone.Time. Pierwszym projektem na liście będzie ten, który ma najdłuższą właściwość Czas w kolekcji Milestone.

Potrzebujesz pomocy z łączem.

Odpowiedz

10

Brzmi to może chcesz

var query = DataAccess.TimelineCollection 
         .OrderBy(t => t.MileStones.Min(m => m.Time)); 

Innymi słowy, dla każdego TimeLine znajdź najwcześniej milestone, i użyć jej do zamawiającego.

Oczywiście jeśli etapy są w porządku, można użyć:

var query = DataAccess.TimelineCollection 
         .OrderBy(t => t.MileStones.First().Time); 

Oba zawiedzie jeśli TimeLine nie ma etapów.

+0

Jon, dziękuję za odpowiedź. Czy istnieje sposób, aby sprawdzić, czy TimeLine nie ma kamieni milowych i po prostu umieścić go na wierzchu? – dotsa

+0

'DataAccess.TimelineCollection .gdzie (M => m.MilesStones.Count! = 0) .OrderBy (T => t.MilesStones.Min (M => m.MilestoneDate)) .Concat ((DataAccess.TimelineCollection. Gdzie (m => m.MilesStones.Count == 0)); ' – dotsa

+0

@dotsa: Można użyć' .OrderBy (t.MileStones.Select (x => x.Time) .FirstOrDefault()) ' –