如何在OData查询中筛选出拥有指定SkillTask的供应商?
正确的OData查询实现方法
你需要在$filter中使用**集合运算符any**来判断供应商是否存在符合条件的SkillTasks条目,同时结合$expand时的过滤来只返回匹配的TaskId=14的SkillTasks(按需保留)。
最终查询语句
http://myApp/odata/Suppliers?$filter=SkillTasks/any(s: s/TaskId eq 14)&$expand=SkillTasks($filter=TaskId eq 14)&$select=Id,Name
关键说明
SkillTasks/any(s: s/TaskId eq 14):该条件会筛选出至少拥有一个TaskId=14的SkillTasks的供应商,直接排除没有匹配项的供应商。其中s是集合元素的别名,可替换为任意合法名称(如t)。- 保留
$expand=SkillTasks($filter=TaskId eq 14):确保展开的SkillTasks仅包含符合条件的条目,避免返回该供应商的全部SkillTasks数据。 - 若仅需筛选供应商、不需要展开关联数据,可去掉
$expand部分,只保留$filter和$select。
为什么你之前的查询不生效?
直接使用$filter=(SkillTasks.TaskId eq 14)不符合OData规范:当关联属性是集合类型(SkillTasks为集合)时,无法直接通过集合的子属性过滤,必须使用any(判断存在至少一个匹配项)或all(判断所有项都匹配)这类集合运算符来处理集合条件。
内容的提问来源于stack exchange,提问作者user3057544
相关产品推荐
相关产品推荐

