我終於找到了什麼可能是錯誤的,但我不知道如何解決它。
如果我試圖傳遞參數查詢這樣的:將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);
}
}
而且它的工作原理和以前一樣 - 過濾器的查詢與EQ,LT等工作正常,包含不會在所有的工作。
編輯:我知道!該問題可能是使用此修補程序的結果:http://www.nuget.org/packages/Patches.System.Web.OData/5.3.0-datetimefixes而不是官方的OData庫。但我非常需要這個datetimefixes ...
你可以將'GET'請求的控制器方法附加到你想要過濾的實體集嗎? –