C# Web API 2 REST服务高级数据过滤
我的团队目前已经使用.NET的WebAPI2平台实现了一个RESTAPI(JSON)。我们有一些工作URL,例如: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
/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