【发布时间】:2014-05-13 13:44:14
【问题描述】:
我试图弄清楚如何编写一个 IQueryable 数据源,该数据源可以从多个源(在本例中为 Azure Table、Azure Blob 和 ElasticSearch)提取和组合数据。不过,我真的很难弄清楚从哪里开始。
这个想法是,Web 服务(在本例中为 Asp.Net Web Api)可以提供可查询的 OData 接口,但当它被查询时,它会根据请求从多个来源提取数据。如此大的查询可能会命中索引服务 (ElasticSearch),它不一定具有可用的完整对象,但获取单个对象的调用将直接转到 Azure 表。但从服务用户的角度来看,它始终只是访问同一个数据源。
虽然我想只使用索引作为我们的搜索服务并使用表作为我们的备份,但我有一个设计要求,它必须从多个来源提取数据,这使整个事情变得非常复杂。
我想知道是否有人对此有任何指导或可以向我指出正确的技术。我看到的一些大问题是:
- 后端对象不一定与被查询的前端对象相同。多个后端对象可能会组合成一个前端对象,或者它可能具有计算值。因此,必须翻译或映射 LINQ 查询
- 根据查询参数更改数据源
以下是我正在使用的技术的简要概述:
- 作为 Azure 云服务运行的 ASP.Net Web API 2 Web 服务
- 在 SUSE VM 上运行的 ElasticSearch(在 Azure 上)
- Azure 表
- Azure Blob
【问题讨论】:
-
你是怎么解决这个问题的?
-
老实说,在研究之后,我们决定简化并只使用更多定向 api 调用(GetAllLicensedUsers 而不是 IQueryable GetAll)。
-
但是 Gregory A Beamer 给出了正确的答案。我确实解决了这个问题。现在已经有一段时间了,但是有一个类可以部分解析查询,我们使用 AutoMapper 投影来规范化数据。我相信它可以双向使用。它可以根据不同来源的特定规则更改查询,并且在返回时将数据映射到统一的模型。对不起,我没有更好的答案。已经有一段时间了。
-
谢谢。我一直在考虑抽象出一个每个存储库都可以解释的查询接口,但这似乎是一项繁重的工作。
-
是的,一个不平凡的问题,不仅要解决,还要实施。除非有很好的理由,否则我会避免它。
标签: c# linq azure elasticsearch iqueryable