![](/img/trans.png)
[英]Compile LINQ query that uses external data source using CSharpCodeProvider
[英]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查询中使用的表达式的智能方法。
也就是说,可能有必要使用多步骤方法作为折衷方案:
例:
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.