我正在存储基本上等于存储在CSV文件中的日志数据。其格式为<datetime>,<val1>,<val2>,
等。但是,日志文件是按帐户ID和月份存储的,因此,如果跨月或帐户ID进行查询,则将检索多个文件。
我希望能够使用LINQ进行查询,以便可以调用logFiles.Where(o => o.Date > 1-1-17 && o.Date < 4-1-17)
。我想我需要一些东西来检查该查询中的日期范围,并注意到它跨越4个月,这导致它仅检查该日期范围内的文件。
有什么方法可以做到这一点,而不必担心使用自定义IQueryable LINQ provider使我的手变得很脏吗?如有必要,我可以沿着那个兔子洞走,但是我想确保它首先是正确的兔子洞。
答案 0 :(得分:1)
如果您要同时过滤日志文件名和相同Where
表达式中的日志文件内容,我会看到没有自定义{{1 }} LINQ提供程序,因为这正是它们的用例:基于LINQ查询中使用的表达式以智能的方式访问数据。
也就是说,可能有必要使用多步骤方法作为折衷方案:
示例:
IQueryable
如果您以延迟执行的方式实现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();
(a),并且(b)作为ParseLogFiles
上的扩展方法,则生成的代码外观将与纯LINQ非常相似:
IEnumerable<LogFile>
这比在单个LINQ查询中具有全部功能要多得多,但是它使您不必实施自己的LINQ提供程序。