此代码是否会延迟事件日志的检索,直到它们被查询?
Does this code defer retrieval of the event logs until they've been queried?
其中 log
是类型 EventLog
的对象,此代码...
log.Entries.Cast<EventLogEntry>().Where(x => x.TimeGenerated == myDate).ToList();
...在检索所有日志之前以某种方式查询(我的 Where
lambda)以使其性能更好? (类似于 EF 处理数据库查询的方式)还是首先将整个日志拉入内存并从那里过滤?
如果是后者,是不是'best'(即快,多'performant')改用this approach(即传入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;
其中 log
是类型 EventLog
的对象,此代码...
log.Entries.Cast<EventLogEntry>().Where(x => x.TimeGenerated == myDate).ToList();
...在检索所有日志之前以某种方式查询(我的 Where
lambda)以使其性能更好? (类似于 EF 处理数据库查询的方式)还是首先将整个日志拉入内存并从那里过滤?
如果是后者,是不是'best'(即快,多'performant')改用this approach(即传入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;