我有一个名为JobsController的OData控制器。 此控制器表示作业实体
public class Job
{
int Id {get;set;}
int Name {get;set;}
...
}
为了进行查询,我需要客户端向我发送一个contextId(数据库标识符)。 通过检查contextId,初始化正确的数据库。 显然,contextId不是Job模型的一部分......
我希望我的控制器看起来像这样:
[HttpGet]
[ODataRoute("Jobs")]
[EnableQuery]
public IHttpActionResult Get()
{
var unitOfWork = UnitOfWorkFactory.Create(contextId);
if (unitOfWork == null)
return InternalServerError(new Exception("Unit of work not found"));
return Ok(unitOfWork.Jobs.GetAll());
}
我希望我可以查询这样的内容:http://localhost:38483/odata/Jobs('localDb')但不可能
答案 0 :(得分:0)
首先,这似乎是处理这个问题的一种非常奇怪的方式,有一个可以连接到两个不同数据库的服务似乎令人困惑,你可以设置两个不同的端点吗?
如果确实要求所有人都在一个端点,那么OData对基于您设置的模型/元数据的URL有非常严格的定义,并且您应该能够过滤的任何内容等都应包含在元数据中,以便客户端可以通过仅使用元数据来使用服务。如果要在URL中包含此内容,则必须考虑如何将其应用于元数据。或者,最好,您可以使用自定义标头来实现此目的。
使用自定义标头只是发送标头并从Request对象中在控制器中检索它的情况
要将其包含在您的模型中,我能想到的最好的事情是设置包含的实体,以便您拥有http://localhost:38483/odata/localDb/Jobs/。您可以在此处找到更多信息:https://docs.microsoft.com/en-us/aspnet/web-api/overview/odata-support-in-aspnet-web-api/odata-v4/odata-containment-in-web-api-22