Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/268.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用虚拟(外键)引用通过延迟/急切加载提高效率_C#_Linq_Lambda - Fatal编程技术网

C# 使用虚拟(外键)引用通过延迟/急切加载提高效率

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 {

我对Lambda/Linq比较陌生,但是我想从一个特定的日历中检索所有事件,其中的事件仍在将来

如果我使用:

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);
}