2012-06-04 2 views
5

ПростогоOrderBy объект Родителя вложенного 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} 
} 

Я попробовал: from t in DataAccess.TimelineCollection.OrderBy(c=>c.MilesStones.OrderBy(z=>z.MilestoneDate)) select t; но получил сообщение об ошибке, что «по крайней мере один объект должен реализовать IComparable.»

Мне нужно заказать TimeLine по Milestone.Time. Первым проектом в списке будет тот, у которого есть свойство leraliest Time в коллекции Milestone.

Нужна помощь по ссылке.

ответ

10

Это звучит, как вы могли бы хотеть

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

Другими словами, для каждого TimeLine, найти ранние вехи, и использовать его для заказа.

Конечно, если эти этапы в порядке, вы можете использовать:

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

Оба они будут терпеть неудачу, если любой TimeLine не имеет этапов.

+0

Джон, спасибо вам за ответ. Есть ли способ проверить, нет ли TimeLine без вех и просто поставить его сверху? – dotsa

+0

'DataAccess.TimelineCollection .Where (m => m.MilesStones.Count! = 0) .OrderBy (t => t.MilesStones.Min (m => m.MilestoneDate)) .Concat ((DataAccess.TimelineCollection. Где (m => m.MilesStones.Count == 0))); ' – dotsa

+0

@dotsa: Вы можете использовать' .OrderBy (t.MileStones.Select (x => x.Time) .FirstOrDefault()) ' –

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