c# - 如何创建一个可以从多个数据源提取数据的 IQueryable Web API?

标签 c# linq azure elasticsearch iqueryable

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

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

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

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

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

以下是我正在使用的技术的快速概述:

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

最佳答案

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

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

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

整个系统。

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

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

关于c# - 如何创建一个可以从多个数据源提取数据的 IQueryable Web API?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23632971/

相关文章:

c# - 从对象列表中获取 n 个(部分)对象,从 n 个索引开始

c# - C# Linq 扩展方法如何执行相等比较?

c# - 优化 LINQ Count() > X

python - 如何选择合适的 openai.api_version?

azure - 为什么创建 Azure 容器实例需要这么长时间?

c# - 如何在 javascript 和 ASP.NET 中返回项目的当前域?

c# - 如何在 c# asp.net 中处理多个链接按钮的单个事件

Azure函数无法识别云存储和队列类

c# - 等待动画在MVVM中完成的最佳方法是什么?

c# - 如何使用 LINQ 添加两条记录?