2014-12-19 59 views
0

根據此文檔:http://docs.oasis-open.org/odata/odata/v4.0/errata02/os/complete/part2-url-conventions/odata-v4.0-errata02-os-part2-url-conventions-complete.html#_Toc406398094 我應該能夠通過$ filter參數查詢(如「$ filter = contains(PropertyName,'SomeValue')」)。

當我通過邏輯運算符(例如: $濾波器=的PropertyName當量 'someValue中')能正常工作。但是,像功能「包含」,「子」,「的endsWith」,「startswith」等從未工程 - 由應用ODataQueryOptions到DbSet查詢結果總是空集。

任何想法爲什麼?

+0

你可以將'GET'請求的控制器方法附加到你想要過濾的實體集嗎? –

回答

2

所以你的意思$過濾=包含(屬性名,「someValue中」)不與您的服務工作?該功能本身可以正常工作,請使用http://services.odata.org/TripPinWebApiService/People?$ filter = contains(FirstName,'Angel')。如果您顯示代碼的更多細節,它將幫助其他人解決您的問題。你可以去https://github.com/OData/ODataSamples/tree/master/Scenarios/TripPin看到一個OData的V4樣品服務的實現或者去http://aspnet.codeplex.com/SourceControl/latest#Samples/WebApi/OData/v4/ODataQueryableSample/瞭解可查詢和$過濾器是如何工作的。

既然你沒有張貼你的代碼,我不知道有什麼問題,我只是有一個快速implmentation和$過濾器可以很好地工作。希望可以幫助。

Model類人

public class Person 
    { 
     [Key] 
     public String ID { get; set; } 

     [Required] 
     public String FirstName { get; set; } 

     [Required] 
     public String LastName { get; set; } 

     [Required] 
     public int Age { get; set; } 

     public String Description { get; set; } 
    } 

PeopleController.cs

[EnableQuery] 
public class PeopleController : ODataController 
{ 
    public IHttpActionResult Get() 
    { 
     return Ok(DemoDataSources.Instance.People.AsQueryable()); 
    } 
} 

WebApiConfig.cs

public static class WebApiConfig 
    { 

     public static void Register(HttpConfiguration config) 
     { 
      config.MapODataServiceRoute("odata", null, GetEdmModel(), new DefaultODataBatchHandler(GlobalConfiguration.DefaultServer)); 
      config.EnsureInitialized(); 
     } 

     private static IEdmModel GetEdmModel() 
     { 
      ODataConventionModelBuilder builder = new ODataConventionModelBuilder(); 
      builder.Namespace = "Demos"; 
      builder.ContainerName = "DefaultContainer"; 

      builder.EntitySet<Person>("People"); 

      var edmModel = builder.GetEdmModel(); 

      return edmModel; 
     } 
    } 

然後請求可以工作http://localhost:21830/People?$filter=contains(Description,'Lorem')正確

0

我終於找到了什麼可能是錯誤的,但我不知道如何解決它。

如果我試圖傳遞參數查詢這樣的:將OData的查詢選項來我查詢後

http://(...)/People?$filter=SomeProperty eq 'Foo' 

在我的WebAPI控制器的方法,那就是:

IQueryable<People> queryResults = (IQueryable<People>)queryOptions.ApplyTo(query); 

在queryResults有是這樣一個片段:

WHERE (`Project1`.`SomeProperty` = @p__linq__0) 

一切工作正常。但是,當我通過查詢這樣的:

http://(...)/People?$filter=contains(SomeProperty, 'Foo') 

在queryResults我可以看到:

WHERE (`Project1`.`SomeProperty` LIKE '%p__linq__0%') 

而且總是有沒有結果。 我不知道我是否理解正確,但它似乎正在尋找包含文本'p__linq__0'的SomeProperty值,而不是查找包含p__linq__0(即'Foo')的的值。


感謝您的回覆,@錢安利。 我的控制器看起來就像是:

public class PeopleController : ApiController 
{ 
    readonly PeopleContext _context = new PeopleContext(); 

    public PageResult<People> Get(ODataQueryOptions<People> queryOptions) 
    { 
     var query = _context.People.OrderBy(x => x.SomeProperty1); 
     var queryResults = (IQueryable<People>)queryOptions.ApplyTo(query); 
     long cnt = 0; 
     if (queryOptions.Count != null) 
      cnt = long.Parse(Request.Properties["System.Web.OData.TotalCount"].ToString()); 

     return new PageResult<People>(queryResults, null, cnt); 
    } 
} 

(這與「CNT」怪異的解決辦法解釋有:Items count in OData v4 WebAPI response) 但現在我放棄使用計數和我換控制器實現的東西像你所描述的:

[EnableQuery] 
public class PeopleController : ODataController 
{ 
    public IHttpActionResult Get() 
    { 
     var query = _context.People.OrderBy(x => x.SomeProperty1); 
     return Ok(query); 
    } 
} 

而且它的工作原理和以前一樣 - 過濾器的查詢與EQLT等工作正常,包含不會在所有的工作。

編輯:我知道!該問題可能是使用此修補程序的結果:http://www.nuget.org/packages/Patches.System.Web.OData/5.3.0-datetimefixes而不是官方的OData庫。但我非常需要這個datetimefixes ...

+0

由於你沒有發佈你的代碼,我不確定是什麼問題,我只是在我發佈的答案中有一個快速實現,$ filter可以很好地工作。希望可以幫助。 – QianLi

+0

謝謝。不幸的是它仍然不起作用。我發佈了我的控制器代碼。 – anaid

+1

控制器應該從'ODataController'而不是'ApiController'繼承。 – QianLi