C# 使用虚拟(外键)引用通过延迟/急切加载提高效率
我对Lambda/Linq比较陌生,但是我想从一个特定的日历中检索所有事件,其中的事件仍在将来 如果我使用:C# 使用虚拟(外键)引用通过延迟/急切加载提高效率,c#,linq,lambda,C#,Linq,Lambda,我对Lambda/Linq比较陌生,但是我想从一个特定的日历中检索所有事件,其中的事件仍在将来 如果我使用: EventCalendar eventCalendar; eventCalendar = db.Events_Calendars.Find(id); 我可以在视图中获取所有事件并按当前日期进行过滤,但我认为这不是最好的方法 模型如下: [Table("Events_Calendars")] public class EventCalendar { public int Id {
EventCalendar eventCalendar;
eventCalendar = db.Events_Calendars.Find(id);
我可以在视图中获取所有事件并按当前日期进行过滤,但我认为这不是最好的方法
模型如下:
[Table("Events_Calendars")]
public class EventCalendar
{
public int Id { get; set; }
public string Calendar { get; set; }
public virtual List<Event> Events { get; set; }
}
意见是:
@model WebApps.Areas.Events.Models.EventCalendar
@* does some stuff with the EventCalendar *@
@Html.Partial("_Events", Model.Events.ToList())
_事件局部视图:
@model IEnumerable<WebApps.Areas.Events.Models.Event>
.
.
.
@foreach (var item in Model)
{
if (item.End > DateTime.Today)
{
@* Do that thing *@
}
}
当我请求日历但仍然只使用一条语句时,是否有一种方法可以过滤事件
注意:在本系统中,即时加载默认为打开
编辑澄清=返回“不超过1个包含所有相关未来事件的日历” 事件。任何都将过滤至少有一个事件的
事件\u日历
,其中结束>=DateTime.Today
。它不会过滤事件\日历事件本身
以下内容将仅针对匹配的事件日历返回Events.End>=DateTime.Today
var events = db.Events_Calendars
.Where(x => x.Id == id)
.SelectMany(x => x.Events)
.Where(x => x.End >= DateTime.Today);
如果将Events\u Calendar属性添加到事件中,您仍然可以显示日历
或者,您可以重新映射事件日历,例如使用factory方法:
var newCal = Events_Calendars.WithFutureEvents(db.Events_Calendars.Find(id))
class Events_Calendar
{
public static Events_Calendar WithFutureEvents(Events_Calendar cal)
{
return new Events_Calendar()
{
Id = cal.Id,
Calendar = cal.Calendar,
Events = cal.Events.Where(x => x.End >= DateTime.Today).ToList()
};
}
}
注意,代码示例意味着新的事件日历具有事件的参考副本
另一种可能性是在活动日历上使用Covenence方法
class Events_Calendar
{
public IEnumerable<Event> FutureEvents => Events.Where(e => e.End >= DateTime.Today);
}
课程活动\u日历
{
public IEnumerable FutureEvents=>Events.Where(e=>e.End>=DateTime.Today);
}
我应该提到的是,我在您编写答案的同时编辑了查询语句。请在示例中添加FirstOrDefault,这给了我一个与SelectMany有关的问题。我喜欢你关于重新映射的想法,虽然我不能在这个案例中使用它,但我会记住它以备将来参考。为了澄清,我只需要一个日历,其中包含所有相关的未来事件。重新映射会为你提供准确的描述Find
返回第一个日历,工厂过滤掉所有您不想要的事件。我添加了第三个选项:一个额外的属性,它只提供您感兴趣的事件。重新映射按您所说的那样工作。谢谢我必须仔细阅读工厂过滤器和重新映射。如果你知道对初学者有很好的解释,请随意发布。
var newCal = Events_Calendars.WithFutureEvents(db.Events_Calendars.Find(id))
class Events_Calendar
{
public static Events_Calendar WithFutureEvents(Events_Calendar cal)
{
return new Events_Calendar()
{
Id = cal.Id,
Calendar = cal.Calendar,
Events = cal.Events.Where(x => x.End >= DateTime.Today).ToList()
};
}
}
class Events_Calendar
{
public IEnumerable<Event> FutureEvents => Events.Where(e => e.End >= DateTime.Today);
}