【问题标题】:Querying external data source with LINQ使用 LINQ 查询外部数据源
【发布时间】:2018-07-23 14:49:02
【问题描述】:

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

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

有什么方法可以做到这一点,而不会涉及到自定义IQueryable LINQ provider 弄脏我的手?如有必要,我可以进入那个兔子洞,但我想首先确保它是正确的兔子洞。

【问题讨论】:

  • 听起来你有足够的数据,你会真正受益于数据库中的数据,而不是平面文件中的数据。试图模拟数据库在许多不同文件中有效搜索大型复杂数据集并允许它们被有效处理的能力并不是一个容易的问题。如果已经有好的解决方案,你最好不要自己解决。
  • 这超出了我的控制——我的老板决定使用平面文件,因为数据量很大,读取次数很少,而且我们希望降低在 Azure 中运行数据库的成本。
  • 大量数据正是在平面文件中管理这些数据成为问题的原因。如果它很小,您可以使用易于编写但效率低下的解决方案。既然不是,你需要非常小心很多事情,才能有一个真正合理的解决方案。
  • 我能提供更多关于日志文件名称和目录方式的信息吗?
  • 但是在两个日期之间修改的具有 csv 扩展名的目录中获取所有文件并不是什么大问题。即使效率不高。但是,如果您开始过滤并合并所选文件中的结果以获得结果,它就会开始变得一团糟。如果您必须处理好编辑,请停止一切​​并使用 Bd。

标签: c# linq custom-linq-providers


【解决方案1】:

如果您想在同一 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&lt;LogFile&gt; 上的扩展方法,则生成的代码将在外观和感觉上与纯 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 提供程序。

【讨论】:

  • 谢谢,这是我希望找到的妥协方案。
猜你喜欢
  • 1970-01-01
  • 2018-08-23
  • 1970-01-01
  • 2020-05-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-03
  • 2013-05-19
相关资源
最近更新 更多