更优雅的方式来获得下一次会议日期

时间:2015-09-11 16:33:21

标签: c# asp.net-mvc entity-framework linq

有没有更优雅的方式去做我在下面尝试做的事情?使用linq获取下次会议的日期。

在Model ODM中,NextMeeting属性(GET)将显示在显示屏上。

[EDITED]

错误的可能性:

OdmMeetiings没有会议(空)。

在OdmMeetiings中没有会议日期>今天。

(我将所有代码名称翻译为英语以帮助理解,如果您发现某些错误,则可以编辑)

namespace Models
{
    public partial class ODM
    {
        public ODM()
        {
             this.OdmMeetiings = new List<OdmMeeting>();
        }

        public int Id  { get;  set; }


        public String NextMeeting //There is a more elegant way to do this. 
        {
            get
            {
                var OdmReuniao = this.OdmMeetiings
                    .Where(x => x.Meeting != null && x.Meeting.StartDate > DateTime.Now)
                    .Select(x => x.Meeting)
                    .ToList() //If is possible, without use ToList
                    .Min(x => x.StartDate)
                    ;


                return OdmReuniao.ToShortDateString();
            }
        }

        public virtual ICollection<OdmMeeting> OdmMeetiings { get; set; }

        }
}

namespace Models
{
    public partial class OdmMeeting
    {
        public int IdMeeting { get; set; }
        public int IdODM { get; set; }
        public virtual ODM ODM { get; set; }
        public virtual Meeting Meeting { get; set; }
    }
}

namespace Models
{
    public partial class Meeting
    {
        public Meeting()
        {
            this.ODMs = new List<OdmMeeting>();
        }

        public int Id { get;  set; }

        public System.DateTime StartDate { get; set; }

        public virtual ICollection<OdmMeeting> ODMs { get; set; }

    }
}

3 个答案:

答案 0 :(得分:3)

您可以通过查询排序,然后获取第一个元素,而不是调用ToList。

var OdmReuniao = this.OdmMeetiings
.Where(x => x.Meeting != null && x.Meeting.StartDate > DateTime.Now)
.Select(x => x.Meeting)
.OrderBy(x => x.Meeting.StartDate)
.FirstOrDefault();

显然,您可以根据自己的要求订购日期。

FirstOrDefault()将返回该类型的第一个元素或默认值(通常为null)。

答案 1 :(得分:2)

修改:更新以说明收集可能为空的可能性以及可能没有OdmMeeting(非空会议参考)的可能性。更新以在排序之前过滤掉空会议参考。

OdmMeeting odmMeeting = this.OdmMeetiings
                    .Where(x => x.Meeting != null)
                    .OrderBy(x => x.Meeting.StartDate)
                    .FirstOrDefault(x => x.Meeting.StartDate > DateTime.Now);

return odmMeeting != null ? odmMeeting.Meeting.StartDate.ToShortDateString() : "-";

此外,由于您只是在1个元素之后,并且不需要重新格式化整个集合的输出,所以Select()似乎有点过分。

答案 2 :(得分:1)

我认为这就是你要找的东西。

首先,您需要测试Meetings是否有项目。 this.OdmMeetiings.Count属性显示了这一点。

第二:您需要测试StartDate > DateTime.Now条件以了解是否要返回至少一个项目(如果您想跳过时间,请使用Date属性)。

第三:不需要命令获取下一个日期,Min已经这样做了。

以下代码:

    public string NextMeeting
    {
        get
        {
            return this.OdmMeetiings.Count > 0 
                    && this.OdmMeetiings.Any(x => x.Meeting.StartDate.Date > DateTime.Now.Date) ?
                    this.OdmMeetiings.Where(x => x.Meeting.StartDate.Date > DateTime.Now.Date).Min(x => x.Meeting.StartDate).ToShortDateString() 
                    : "-"; 
        }
    }