我终于发现了可能是什么问题,但我不知道如何解决它。
如果我尝试像这样传递参数查询:
http://(...)/People?$filter=SomeProperty eq 'Foo'
在将 OData 查询选项应用于我的查询后,在我的 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 的 value 的值(即 'Foo' )。
感谢您的回复,@QianLi。
我的控制器看起来像这样:
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)
但是现在我放弃了使用 Count 并将控制器实现更改为您所描述的内容:
[EnableQuery]
public class PeopleController : ODataController
{
public IHttpActionResult Get()
{
var query = _context.People.OrderBy(x => x.SomeProperty1);
return Ok(query);
}
}
它的工作原理和以前一样 - 使用 eq、lt 等过滤查询工作正常,contains 根本不起作用.
编辑:我知道!问题可能是使用此修复程序的结果:http://www.nuget.org/packages/Patches.System.Web.OData/5.3.0-datetimefixes 而不是官方 OData 库。但是我非常需要这个 datetimefixes...