我在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完成这个?
答案 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
,请使用或运算符