有没有更优雅的方式去做我在下面尝试做的事情?使用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; }
}
}
答案 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()
: "-";
}
}