Web API 2 Odata过滤器无法正常工作

时间:2014-06-13 08:33:16

标签: filter odata asp.net-web-api2

我在WebAPI 2 Odata项目中使用多个过滤器时遇到问题。

我们只需要JSON输出,并且只有一个对象类型可供查询,所以我们将url设置为“/”,而不可能使用不同的控制器。

我想要使用以下属性查询对象:

 public class Content
 {
    public int Id { get; set; }
    public string Title { get; set; }
    public string Excerpt { get; set; }
    public string Link { get; set; }
    public IList<Tag> Tags  { get; set; }
 }

 public class Tag 
 {
    public string Id { get; set; }
    public string Name { get; set; }
 }

控制器代码如下所示:

public class ContentController : ApiController
{

    private readonly IContentRepository _repository;

    // constructor
    public ContentController(IContentRepository repository)
    {
        _repository = repository;
    }

    [Queryable]
    public IQueryable<Content> Index()
    {
        // IContentRepository.GetAll returns an IEnumerable List of Content
        return _repository.GetAll().AsQueryable();
    }
}

现在,我已经通过向存储库添加多个对象来模拟一些testdata,这些对象具有多个标记,其值设置为(test1,test2或test3)。现在当我查询

http://localhost:xxx?$filter=Tags/any(o: o/Id eq 'test1')

我将Tag / Id设置为'test1'的所有对象。但如果我查询

http://localhost:xxx?$filter=Tags/any(o: o/Id eq 'test1' and o/Id eq 'test2')

我没有得到任何结果(JSON return = [])。但它应该返回具有两个标记的对象。

我做错了什么?

编辑: 我的示例数据JSON如下所示:

[
 {
   "Id": 1,
   "Title": "TESTOBJECT 1",
   "Excerpt": "",
   "Link": "",
   "Tags": [
             {
               "Id": "test1",
               "Name": "Test Tag 1",
             }
           ],
 },
 {
   "Id": 2,
   "Title": "TESTOBJECT 2",
   "Excerpt": "",
   "Link": "",
   "Tags": [
             {
               "Id": "test2",
               "Name": "Test Tag 2",
             }
           ],
 },
 {
   "Id": 3,
   "Title": "TESTOBJECT 3",
   "Excerpt": "",
   "Link": "",
   "Tags": [
             {
               "Id": "test3",
               "Name": "Test Tag 3",
             }
           ],
 },
 {
   "Id": 4,
   "Title": "TESTOBJECT 4",
   "Excerpt": "",
   "Link": "",
   "Tags": [
             {
               "Id": "test1",
               "Name": "Test Tag 1",
             },
             {
               "Id": "test2",
               "Name": "Test Tag 2",
             }
           ],
 },
 {
   "Id": 5,
   "Title": "TESTOBJECT 5",
   "Excerpt": "",
   "Link": "",
   "Tags": [
             {
               "Id": "test1",
               "Name": "Test Tag 1",
             }
           ],
 }
]

现在查询一个给我对象1,4,5,我希望查询二给我对象4.如何用odata完成这个?

2 个答案:

答案 0 :(得分:1)

你想要这个吗?

http://localhost:xxx?$filter=Tags/any(o: o/Id eq 'test1') and Tags/any(o: o/Id eq 'test2')

答案 1 :(得分:0)

((X ==“test1”)AND(X ==“test2”))将始终返回false!

如果您要识别其属性Tags test1 test2 Id,请使用运算符