使用LINQ查询外部数据源

时间:2018-07-23 14:49:02

标签: c# linq custom-linq-providers

我正在存储基本上等于存储在CSV文件中的日志数据。其格式为<datetime>,<val1>,<val2>,等。但是,日志文件是按帐户ID和月份存储的,因此,如果跨月或帐户ID进行查询,则将检索多个文件。

我希望能够使用LINQ进行查询,以便可以调用logFiles.Where(o => o.Date > 1-1-17 && o.Date < 4-1-17)。我想我需要一些东西来检查该查询中的日期范围,并注意到它跨越4个月,这导致它仅检查该日期范围内的文件。

有什么方法可以做到这一点,而不必担心使用自定义IQueryable LINQ provider使我的手变得很脏吗?如有必要,我可以沿着那个兔子洞走,但是我想确保它首先是正确的兔子洞。

1 个答案:

答案 0 :(得分:1)

如果您要同时过滤日志文件名和相同Where表达式中的日志文件内容,我会看到没有自定义{{1 }} LINQ提供程序,因为这正是它们的用例:基于LINQ查询中使用的表达式以智能的方式访问数据。

也就是说,可能有必要使用多步骤方法作为折衷方案:

  1. 使用LINQ限制要搜索的日志文件,
  2. 读取文件并
  3. 使用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提供程序。

相关问题