2016-03-22 19 views
2

Ekibim, .NET için Web API 2 platformunu kullanan bir REST API'sı (JSON) uygulamaktadır. verilerimiz kontrolör kodun bazı edilir buradaWeb API 2 REST Hizmeti Gelişmiş Veri Filtreleme

/api/schools 
/api/schools/5000 
/api/occupations 
/api/occupations/22 

Ve: Biz şimdi veri filtreleme sunuyoruz

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);   
    } 

} 

(kullanıcı onay kutusu seçime göre) ve ben merak ediyorum Biz gibi bazı çalışma URL'ler, var Mevcut API'mızda buna nasıl yaklaşılacağı, ya da filtreleme için REST'i terk edip farklı bir yaklaşımı hep birlikte denemeli miyim? İşte

bizim onay kutusu mekanizması filtrelediğini: Checkbox UI

nasıl DİNLENME hizmet ve DataController yöntemlerde arama parametrelerini tanıtabilir? Gibi, bir alandaki bir menzil filtresini nasıl alabilirim (Maliyeti?)? Maliyet, Öğrenim, vb. Gibi birden çok alan filtrelemeye sahip olabilir miyim? Yukarıdaki açıklamalar itibaren

+0

Sen orada Web API için OData uygulamaya bakmak gerekir bir çift Yüklemeniz gereken MS NuGet paketleri. Bundan sonra, ortaya çıkarmak istediğiniz şeyi yapılandırmak, arayanları sınırlamak istediğiniz herhangi bir kısıtlama (maksimum sayfa boyutu gibi) ve geri kalanlar, URL tarafından filtrelenecek, sayfalara, sıralamalara vb. Bu bağlantı] (http://www.asp.net/web-api/overview/odata-support-in-aspnet-web-api) ve [bu] (http://www.odata.org/blog/how Başlamak için -to-use-web-api-oda-to-build-bir-odata-v4-hizmet-varlık-çerçeve /). – Igor

+0

Bu arada, oData'yi her şey için bir battaniye yaklaşımı olarak kullandığınızı savunmuyorum. Sadece esnek alıcıya/istemciye başvurmak istediğiniz belirli modeller. – Igor

+0

Entity Framework ile mümkün mü? OData örneğinin EF olmadan olduğunu fark ettim. Yine de hoşuma gitti! – AussieJoe

cevap

2

:

Web API için OData uygulamaya bakmak gerekir, MS Nuget bir çift yüklemek zorunda paketler vardır. Bundan sonra, ortaya çıkarmak istediğiniz şeyi yapılandırmak, arayanları sınırlamak istediğiniz herhangi bir kısıtlama (maksimum sayfa boyutu gibi) ve geri kalanlar, URL tarafından filtrelenecek, sayfalara, sıralamaya vb. Yönlendirerek istemci tarafından yapılır.

İşte

bir örnek:

URL örnek

Bu öğrenci sayısı dahil 10 ila 100'in

olan adına göre sıralanmış listesinde ilk 24 okulu alır
/odata/Schools/?$count=true&$top=24&$skip=0&$filter=(numberOfStudents ge 10 and numberOfStudents le 100)&$orderby=name desc 

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); 
    } 
} 

WebApiConfig.cs

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(); 
    } 
} 

Nuget paketleri

Install-Package Microsoft.AspNet.OData 
Install-Package Microsoft.OData.Core 
Install-Package Microsoft.OData.Edm 
+0

çok güzel! esinti gibi çalışır. Bu çözümü çok seviyorum! Şerefe! – AussieJoe

+0

@AussieJoe - bunu duyduğuma sevindim! – Igor

+0

Geleneksel Web API'sini ve OData'yı yapılandırmada kullanmak mümkün mü? Okul denetleyicimi OData'ya dönüştürdüğümde fark ettim, diğer ApiController artık çalışmıyor. Birlikte çalışabilir mi yoksa tüm kontrolörler API’da OData olabilir mi? – AussieJoe