使用MVC Web Api进行ODATA和CRUD操作

时间:2015-09-24 14:01:50

标签: c# asp.net-mvc rest web odata

我需要创建一个服务(目前使用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参数?我真的不知道最好的方法是什么。

1 个答案:

答案 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数据库查询。