Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/276.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# Web API 2 REST服务高级数据过滤_C#_.net_Rest_Asp.net Web Api2_Filtering - Fatal编程技术网

C# Web API 2 REST服务高级数据过滤

C# Web API 2 REST服务高级数据过滤,c#,.net,rest,asp.net-web-api2,filtering,C#,.net,Rest,Asp.net Web Api2,Filtering,我的团队目前已经使用.NET的WebAPI2平台实现了一个RESTAPI(JSON)。我们有一些工作URL,例如: /api/schools /api/schools/5000 /api/occupations /api/occupations/22 下面是我们的一些数据控制器代码: public class OccupationsController : ApiController { // /api/Occupations/1991 public IHttpActio

我的团队目前已经使用.NET的WebAPI2平台实现了一个RESTAPI(JSON)。我们有一些工作URL,例如:

/api/schools 
/api/schools/5000 
/api/occupations 
/api/occupations/22
下面是我们的一些数据控制器代码:

public class OccupationsController : ApiController
{
    // /api/Occupations/1991
    public IHttpActionResult GetOccupation(int id)
    {
        var occupation = GetAllOccupations().FirstOrDefault((p) => p.OccupationID == id);
        if (occupation == null)
        {
            return NotFound();
        }
        return Ok(occupation);
    }
    // /api/occupations
    public IEnumerable<Occupation> GetAllOccupations()
    {
        var ctx = new TCOSDBEntities();
        return ctx.Occupations.OrderBy(occupation => occupation.Title);          
    }

}
公共类职业控制器:ApiController
{
///api/Occupations/1991
公共IHttpActionResult GetOccupation(int id)
{
var occupations=GetAllOccupations().FirstOrDefault((p)=>p.OccupationID==id);
if(职业==null)
{
返回NotFound();
}
返回Ok(职业);
}
///api/职业
公共IEnumerable GetAllOccupations()
{
var ctx=新的tcosdbenties();
返回ctx.occulations.OrderBy(occulation=>occulation.Title);
}
}
我们现在正在引入数据过滤(基于用户复选框选择),我很好奇如何在我们现有的API中实现这一点,或者我是否应该放弃REST进行向下过滤,一起尝试不同的方法

以下是我们的复选框过滤机制:


如何在REST服务和DataController方法中引入搜索参数?比如,如何在字段上获得范围过滤器(比如成本?)?我可以有多个字段进行筛选,如成本、学费等吗?

以上评论:


您应该研究Web API的oData实现,您必须安装几个MS NuGet软件包。在这之后,它主要配置您想要公开的内容、您想要限制调用者的任何限制(如最大页面大小),其余的由客户机通过操纵URL来进行过滤、分页、排序等操作

这里有一个例子:

Url示例

这将检索列表中按名称排序的前24所学校,其中学生人数在10到100之间(含10到100)

SchoolController.cs

using System.Web.Http;
using System.Web.OData;
using System.Web.OData.Routing;

[ODataRoutePrefix("Schools")]
public sealed class SchoolODataController : ODataController
{
    private DbContext _context; // your DbContext implementation, assume some DbSet<School> with the property name Schools

    public SchoolODataController(DbContext context)
    {
        _context = context;
    }

    [EnableQuery(MaxNodeCount = 200, MaxTop = 100, PageSize = 64 )]
    [ODataRoute]
    [HttpGet]
    public IHttpActionResult Get()
    {
        return Ok(_context.Schools);
    }
}
using System.Web.Http;
using System.Web.OData.Builder;
using System.Web.OData.Extensions;

public static class WebApiConfig {
    public static void Register(HttpConfiguration config) {
        // other code
        config.MapODataServiceRoute("odata", "odata", GetModel());
    }

    public static IEdmModel GetModel()
    {
        var builder = new ODataConventionModelBuilder();
        builder.EnableLowerCamelCase();
        var setOrders = builder.EntitySet<SchoolModel>("Schools").EntityType.HasKey(x => new { x.SchoolId });
        return builder.GetEdmModel();
    }
}

您应该研究Web API的oData实现,您必须安装几个MS NuGet软件包。在这之后,主要是配置您想要公开的内容、您想要限制调用者的任何限制(如最大页面大小),其余的由客户端通过操纵URL进行过滤、分页、排序等。查看并开始。顺便说一句,我不主张您使用oData作为所有内容的综合方法,只是那些您希望通过/a客户机公开灵活检索的特定模型。是否可以使用实体框架?我注意到OData示例没有EF?不过我喜欢!绝对地在过去的6个月里,我一直在我们的项目中使用它。我们的客户机是web浏览器,因此我们构建了一个库来创建oData查询字符串(抽象级别以隐藏oData查询细节)。我真的很高兴,每次我们想公开一个需要灵活搜索的模型时,它都为我们节省了很多c代码。另外,使用EF,您传递一个IQueryable,数据库调用由oData框架执行,因此它的重量也很轻。我能想到的唯一负面影响是它是一个泄漏的抽象,因为您正在向调用者公开实现细节。无论如何,对于像您上面这样的场景,我真的推荐它。非常好!工作很轻松。我非常喜欢这个解决方案!干杯@很高兴听到这个消息!在配置中也可以使用传统的Web API和OData吗?我注意到,当我将学校控制器转换为OData时,我的另一个ApiController不再工作。它们可以一起工作,还是所有控制器都必须是API中的OData?@AussieJoe-是的,它们可以在同一个项目中并排工作,而不会出现任何问题。确保在现有api路由信息旁边添加新的路由信息(如我的示例中所示)。我的web api路由以默认的“api/”作为前缀,odata路由以“odata”作为前缀(如示例中所示)。@Igor您可以发布包括dbContext在内的完整实现吗?我是web api的初学者,所以需要理解。
using System.Web.Http;
using System.Web.OData.Builder;
using System.Web.OData.Extensions;

public static class WebApiConfig {
    public static void Register(HttpConfiguration config) {
        // other code
        config.MapODataServiceRoute("odata", "odata", GetModel());
    }

    public static IEdmModel GetModel()
    {
        var builder = new ODataConventionModelBuilder();
        builder.EnableLowerCamelCase();
        var setOrders = builder.EntitySet<SchoolModel>("Schools").EntityType.HasKey(x => new { x.SchoolId });
        return builder.GetEdmModel();
    }
}
Install-Package Microsoft.AspNet.OData
Install-Package Microsoft.OData.Core
Install-Package Microsoft.OData.Edm