列出orderby嵌套属性

时间:2013-06-27 09:25:04

标签: c# asp.net linq

我有一些来自Web服务的数据,我已将其映射到以下类:

public class Webinar {
    public string Title { get; set; }
    public string Description { get; set; }
    ...
    public List<TimeZone> TimeZones { get; set; }
}

public class TimeZone {
    public TimeSpan GmtOffset { get; set; }
    public List<Session> Session { get; set; }
}

public class Session {
    public int WebinarKey { get; set; }
    public DateTime StartTime { get; set; }
    public TimeSpan Duration { get; set; }
}

希望相当清楚发生了什么:任何一个网络研讨会都可以拥有多个时区,而这些时区又可以举办各个会议。

我有一个网络研讨会列表List<Webinar> webinars = ...,其中填充了数据。在页面上,我想展示按时区(简单)分组的网络研讨会,然后按照开始时间排序。

我的问题:当我收到数据时,会话不一定是由StartTime排序的,我想这样做。我有以下代码可以工作,但重新创建每个对象并映射出它的所有属性是PITA,有没有更好的方法来做我想要的?

List<Webinar> webinarsWithOrderedSessions = new List<Webinar>();

foreach (Webinar webinar in mappedWebinars)
{
    Webinar currentWebinar = new Webinar
        {
            Title = webinar.Title,
            ...
            TimeZones = new List<TimeZone>()
        };

    foreach (Webinar.TimeZone timeZone in webinar.TimeZones)
    {
        Webinar.TimeZone currentTimeZone = new TimeZone
            {
                Location = timeZone.Location,
                Sessions = new List<Session>()
            };

        currentTimeZone.Sessions = timeZone.Sessions.OrderBy(session => session.StartTime).ToList();
        currentWebinar.TimeZones.Add(currentTimeZone);
    }

    webinarsWithOrderedSessions.Add(currentWebinar);
}

更新

基于@Max的建议,为什么这些代码不起作用?它似乎根本没有添加会话。我不一定需要两个属性,所以我想我只是将你的建议直接应用到主要属性。

public class TimeZone
{
    private List<Session> _sessions;

    public List<Session> Sessions
    {
        get { return _sessions.OrderBy(s => s.StartTime).ToList(); }
        set { _sessions = value; }
    }
}

2 个答案:

答案 0 :(得分:2)

你可以试试这个:

public class TimeZone 
{
    private List<Session> _ordered;

    public TimeSpan GmtOffset { get; set; }
    public List<Session> Session 
    { 
         get
         {
             return this._ordered;
         }

         set
         {
            if (value != null)
            {
                this._ordered = value.OrderBy(p => p.StartTime);         
            }
         }
    }
}

我使用显式set和get

改进了答案

答案 1 :(得分:0)

尝试这种方式:

var webinarsWithOrderedSessions = (from x in  mappedWebinars
                              from y in x.TimeZones
                              from s in y.Session 
                              orderby s.StartTime 
                              select x).ToList();