Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/278.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用MVC Web Api进行ODATA和CRUD操作_C#_Asp.net Mvc_Rest_Web_Odata - Fatal编程技术网

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

C# 使用MVC Web Api进行ODATA和CRUD操作,c#,asp.net-mvc,rest,web,odata,C#,Asp.net Mvc,Rest,Web,Odata,我需要创建一个服务(目前使用ASP.NET Web Api),该服务从SQL数据库获取数据,并使用OData协议公开这些数据。我对OData和Web Api非常陌生 问题是我不知道如何执行crud操作——我在网上查阅了一些可用的样本,但我的案例有点复杂(或者可能不复杂,很难说)。我正在使用实体框架 有时我需要直接对查询表执行“GET”,而对存储过程执行“POST”。我遇到的最大问题是参数数量的限制。据我所知,我只能有一个 在我的情况下,这是一个问题: public class ProjectsC

我需要创建一个服务(目前使用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;
    }

但是如果我在
dbo.CreateProject([bunch of parameters])
中有一些需要运行的逻辑,并且出于这个原因,我希望运行存储过程,该怎么办呢。使用项目中的值初始化
dbo.CreateProjects
参数?我真的不知道最好的方法是什么。

你想传递多个参数的确切意思是什么
OData
绝对支持具有多个筛选参数和参数的复杂查询

在进行查询时,
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 });

假设您使用的是实体框架,此查询将进一步转换为
SQL
数据库查询。

在中,您可以找到许多关于OData的CRUD操作的测试用例。此外,复合键可以使用属性路由,函数/动作也支持多个参数。感谢EntityFramework,您还可以通过运行存储过程/函数来获取数据。比方说,要使用存储过程获取数据,我需要通过传递两个参数来调用它。GetDriver(@IDDriver,@IDLoginName)。我想在“Get”方法中进行调用。它想知道:public IQueryable Get(string login,int id){var context=new databasecontextities();return context.GetDriverByLoginName(id,key);}什么是使这种场景工作的最佳方法?@skyrunner对于这种场景,您不需要
OData
。只需像这样调用Web API方法:
/API/drivers/{id}?login={login}
queryable
    .Where(p => p.Address == "Redmond")
    .Skip(10)
    .Take(5)
    .Select(p => new { p.FirstName, p.LastName });