繁体   English   中英

使用LINQ查询外部数据源

[英]Querying external data source with LINQ

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

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

有没有办法做到这一点,而不会涉及使用自定义IQueryable LINQ提供程序使我的手变得很脏吗? 如有必要,我可以沿着那个兔子洞走,但是我想确保它首先是正确的兔子洞。

如果要在同一个Where表达式中同时过滤日志文件名和日志文件内容,那么没有定制IQueryable LINQ提供程序就看不到解决方案,因为这正是它们的用例:基于LINQ查询中使用的表达式的智能方法。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM