我需要创建一个服务(目前使用ASP.NET Web Api),该服务从SQL数据库获取数据并使用OData协议公开它们。我对OData和Web Api非常陌生。
问题是我不知道如何进行crud操作 - 我已经查看了一些在线可用的样本,但我的情况有点复杂(或者可能不是,很难说)。我正在使用实体框架。
有时我需要直接查询表来执行“GET”,但是使用存储过程执行“POST”。我遇到的最大问题是参数数量的限制。据我所知,我只能有一个。
在我的案例中,这是个问题:
public class ProjectsController : ODataController
{
[EnableQuery]
[EnableCors(origins: "*", headers: "*", methods: "*")]
public IQueryable<GetProjects_Result> Get(string key)
{
var context = new OPMLVSQL001Entities();
IQueryable<GetProjects_Result> results = context.GetProjects(key);
return results;
}
[EnableQuery]
[EnableCors(origins: "*", headers: "*", methods: "*")]
public GetProject_Result Get(int projectId, string loginName)
{
var context = new OPMLVSQL001Entities();
GetProject_Result result = context.GetProject(projectId, loginName).FirstOrDefault();
return result;
}
该代码不起作用 - 只是为了获取所有项目,我需要传递一个登录参数。要获得一个实体,我需要使用不同的方法 - 我必须传递两个参数。我不知道怎么做OData(我想到了一个hack - 在我可以使用的唯一参数中传递json表。)
那么有没有办法使用多个参数?
我还必须实现“create”方法 - 再次使用存储过程创建实体。在这种情况下,最好的方法是什么?
一种方法可能是将Project实体添加到项目中,然后像这样发布:
[EnableQuery]
[EnableCors(origins: "*", headers: "*", methods: "*")]
public HttpResponseMessage Post(Project project)
{
}
但如果我在dbo.CreateProject([bunch of parameters])
中有一些我需要运行的逻辑怎么办呢?因此我想运行存储过程。使用项目中的值初始化dbo.CreateProjects
参数?我真的不知道最好的方法是什么。
答案 0 :(得分:0)
你究竟想要传递多个参数是什么意思? OData
肯定支持使用多个过滤器参数和much more的复杂查询。
在进行查询时,OData
允许您定义应如何检索,过滤和投影数据。过滤时可以使用任意数量的参数。例如,以下查询字符串:
/people?$skip=10&$top=5&$select=FirstName, LastName&$filter=Address eq 'Redmond'
将被翻译为类似
的内容queryable
.Where(p => p.Address == "Redmond")
.Skip(10)
.Take(5)
.Select(p => new { p.FirstName, p.LastName });
假设您正在使用Entity Framework,此查询将进一步转换为SQL
数据库查询。