如何创建可以从多个数据源中提取数据的IQueryable Web API?

Rip*_*ash 5 c# linq iqueryable azure elasticsearch

我正在试图弄清楚如何编写一个可以从多个源(在本例中为Azure Table,Azure Blob和ElasticSearch)中提取和组合数据的IQueryable数据源.我真的很难弄清楚从哪里开始这个.

我们的想法是,Web服务(在本例中为Asp.Net Web Api)可以呈现可查询的OData接口,但是当它被查询时,它会根据请求从多个源中提取数据.因此,大型查询可能会触及索引服务(ElasticSearch),该服务不一定具有完整对象可用,但是获取单个对象的调用将直接转到Azure表.但从服务用户的角度来看,它始终只是访问相同的数据源.

虽然我想只使用索引作为我们的搜索服务而将表作为我们的备份,但我有一个设计要求,它必须从多个来源提取数据,这使整个事情变得非常复杂.

我想知道是否有人对此有任何指导或可以指出我正确的技术.我看到的一些重大问题是:

  • 后端对象不一定与被查询的前端对象相同.多个后端对象可以组合成单个前端对象,或者它可以具有计算值.因此必须翻译或映射LINQ查询
  • 根据查询参数更改数据源

以下是我正在使用的技术的简要概述:

  • 作为Azure云服务运行的ASP.Net Web API 2 Web服务
  • 在SUSE VM上运行的ElasticSearch(在Azure上)
  • Azure表
  • Azure Blob

Gre*_*mer 2

首先,您需要将数据访问与Web API项目分开。Web API 项目只是一个接口,因此请将其从等式中删除。无论是 Web API 还是 ASP.NET 网页、MVC 解决方案、WPF 桌面应用程序等,问题的解决方案都应该是相同的。

然后您可以专注于数据问题。您需要某种形式的“路由器”来根据做出决定的参数来确定数据源。在这种情况下,您正在谈论 1 个项目 = azure 和超过 1 个项目 - 当超过 1 个项目时,地图会减少(我会将规则设置为策略或类似的规则,这样如果您发现 1 与 2+ 则可以交换)这不是改变路由的好条件)。

然后解决每种方法的数据访问问题。

系统作为一个整体。

  1. 用户请求数据(用户可以是真人,也可以通过Web api是另一个系统)
  2. 查询被部分解析以确定路由路径
  3. 路由器将数据请求发送到处理路由数据访问的适当类
  4. 数据已返回
  5. 数据通过任何使用的用户界面路由回用户(在本例中为 Web API - 请参阅第 1 段了解其他选项)

一点要小心。不要尝试混合所有类型的持久性,因为通用的“我可以提取数据或 blob 或{在此命名您最喜欢的其他持久性存储}”通常最终会变成垃圾箱。