C# 此代码是否将事件日志的检索推迟到';有人问过你吗?

C# 此代码是否将事件日志的检索推迟到';有人问过你吗?,c#,.net,lambda,event-log,C#,.net,Lambda,Event Log,如果log是类型为EventLog的对象,则此代码是否 log.Entries.Cast().Where(x=>x.TimeGenerated==myDate.ToList() …在检索所有日志之前以某种方式查询(myWherelambda),以使其性能更好?(类似于EF如何处理DB查询)或者它是否首先将整个日志拉入内存并从中过滤 如果是后者,那么使用它是否“最佳”(即快速且更“高效”)(即传入XML并让查询执行提升) 我可能说得有点笨拙,我基本上是在问我提到的第一种方法在查询方面是否效率低下。

如果
log
是类型为
EventLog
的对象,则此代码是否

log.Entries.Cast().Where(x=>x.TimeGenerated==myDate.ToList()

…在检索所有日志之前以某种方式查询(my
Where
lambda),以使其性能更好?(类似于EF如何处理DB查询)或者它是否首先将整个日志拉入内存并从中过滤

如果是后者,那么使用它是否“最佳”(即快速且更“高效”)(即传入XML并让查询执行提升)


我可能说得有点笨拙,我基本上是在问我提到的第一种方法在查询方面是否效率低下。

不,它的性能没有任何提高,因为log.Entries实现了简单的
IEnumerable
,而不是像
IQueryable
(比如EF)。这意味着它不会分析“Where”子句表达式树,也不会在枚举之前以某种方式将其转换为事件查询。因此,您的查询大致与以下内容相同:

var result = new List<EventLogEntry>();
foreach (EventLogEntry x in log.Entries) {
    if (x.TimeGenerated == myDate) {
        result.Add(x);
    }
}
return result;
var result=newlist();
foreach(log.Entries中的EventLogEntry x){
如果(x.TimeGenerated==myDate){
结果:添加(x);
}
}
返回结果;

ToList()
强制满载。如果您想推迟检索,只需删除
ToList()
@PanagiotisKanavos-是的,但在此之前,我指定了一个查询。在EF
.ToList().Where…
中,这将是一个糟糕的主意,
.Where().ToList()…
没有那么多。这不一样吗?一点也不一样。IEnumerable仅根据请求检索值。由于延迟迭代,您将获得性能优势
ToList()
检索所有这些文件并将其添加到列表中。您仍然需要读取所有事件,但必须等待所有事件到达,然后才能对其进行迭代。您需要一个LINQ提供程序,该提供程序以EventLog为目标,并将LINQ语句转换为XML查询语言。或者您可以在Event Viewer和@PanagiotisKanavos中创建一个视图-非常感谢!这就把事情弄清楚了。感谢您的回复。精彩、简洁的回答Evk!正是我想要的。非常感谢。