Web API如何基于Optionset选项集值而非ID执行筛选
报错原因
Could not find a property named 'Value' on type 'Edm.Int32'的触发逻辑非常明确:Dataverse Web API里的单值选项集字段底层存储类型就是Edm.Int32,直接返回选项对应的数字ID,根本不存在Value这个嵌套属性,你之前的写法是把整数类型的普通字段当成了带嵌套属性的复杂类型,自然会报类型错误。
实现方案
直接用选项集显示标签做$filter筛选是做不到的——选项集的显示文本是随用户语言设置变化的本地化内容,不会作为固定值存在记录里,只有你在请求头加Prefer: odata.include-annotations="*"时,才会在返回结果里以my_choices@OData.Community.Display.V1.FormattedValue的注释字段带出当前语言下的显示文本,这类注释属性不支持在筛选条件里使用。
要实现你的筛选需求,只有两种可行路径:
- 优先用选项ID直接筛选,这是性能最好、没有歧义的标准写法。比如你要筛选选项为
Two的记录,直接写:?$filter=my_choices eq 9487501 - 如果业务逻辑必须传入标签文本做匹配,先调用实体元数据接口拉取
my_choices字段的选项集定义,把传入的标签文本转换成对应的整数ID,再把ID放到筛选条件里即可。不要在代码里硬编码标签和ID的映射,避免后续选项调整导致逻辑出错。
无效写法避坑
以下几种常见写法都跑不通,不用浪费时间试:
?$filter=my_choices/Value eq 'Two':类型错误,整数字段没有子属性?$filter=my_choices eq 'Two':类型不匹配,整数字段不能和字符串做相等判断?$filter=my_choices@OData.Community.Display.V1.FormattedValue eq 'Two':OData筛选不支持对注释属性做条件匹配
内容的提问来源于stack exchange,提问作者Rob Joosen
相关产品推荐
相关产品推荐

