1 回答
TA贡献1872条经验 获得超3个赞
如果您想在同一Where
表达式中同时过滤日志文件名和日志文件内容,我看不到没有自定义IQueryable
LINQ 提供程序的解决方案,因为这正是它们的用例:以智能方式访问数据方式基于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) 作为 上的扩展方法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 提供程序。
- 1 回答
- 0 关注
- 159 浏览
添加回答
举报