如果您想在同一个Where
表达式中同时过滤日志文件名和日志文件内容,我看不到没有自定义IQueryable
LINQ 提供程序的解决方案,因为这正是他们的用例:To access data in a smart方式基于LINQ 查询中使用的表达式。
也就是说,使用多步骤方法作为折衷方案可能是值得的:
- 使用 LINQ 限制要搜索的日志文件,
- 读取文件和
- 使用 LINQ 进行进一步搜索。
例子:
IEnumerable<LogFile> files = LogFiles.Where(f => f.Date > new DateTime(17, 1, 1) && f.AccountID == 4711);
IEnumerable<LogData> data = ParseLogFiles(files);
IEnumerable<LogData> filteredData = data.Where(d => d.val1 == 42 && d.val2 > 17);
LogData firstMatch = filteredData.FirstOrDefault();
如果您ParseLogFiles
使用延迟执行实现 (a) 和 (b) 作为扩展方法 on IEnumerable<LogFile>
,则生成的代码在外观和感觉上与纯 LINQ 非常相似:
var filteredData = LogFiles.
Where(f => f.Date > new DateTime(17, 1, 1) && f.AccountID = 4711).
ParseLogFiles().
Where(d => d.val == 42 && d.val2 > 17);
// If ParseLogFiles uses deferred execution, the following line won't read
// more log files than required to get the first matching row:
var firstMatch = filteredData.First();
这比在一个 LINQ 查询中完成所有工作要多一些工作,但它使您不必实现自己的 LINQ 提供程序。