C# 环境OData v4调用search.in提示未知函数错误问题咨询
报错原因
search.in并非OData V4原生内置标准函数,它是Azure认知搜索等特定搜索服务扩展的自定义函数,默认的Microsoft.AspNetCore.OData服务端组件未内置该函数的解析、执行逻辑,因此传入对应筛选表达式时会直接抛出未知函数错误。
触发报错的相关配置信息:
- 请求筛选参数:
...$filter=Channels/any(t: search.in(t,'A,B', ',')) - 筛选目标属性定义:
public string[]? Channels { get; set; } - 完整错误信息:
"The query specified in the URI is not valid. An unknown function with name 'search.in' was found. This may also be a function import or a key lookup on a navigation property, which is not allowed."
可行解决方法
- 替换为OData原生语法实现(推荐,无额外适配成本)
OData V4 7.4及以上版本原生支持in操作符,可以直接实现等价的多值匹配逻辑,改写后的筛选表达式如下:
如果使用的OData版本较低不支持...$filter=Channels/any(t: t in ('A', 'B'))in操作符,可以退化为等值判断加逻辑或的写法,兼容性覆盖所有OData V4版本:...$filter=Channels/any(t: t eq 'A' or t eq 'B') - 自定义注册
search.in函数兼容原有写法
如果业务上必须保留search.in的参数写法,可以在服务端OData配置环节手动注册该自定义函数:- 实现
search.in的核心判断逻辑:输入待匹配字符串、分隔符拼接的候选值字符串、分隔符三个参数,返回布尔值表示是否命中 - 在OData模型构建器中注册该函数,绑定到字符串类型,配置参数类型、返回值类型
- 补充该函数到查询提供程序(如EF Core)的翻译逻辑,保证筛选条件可以正确执行
- 实现
- 适配对应服务的扩展依赖
如果接口本身对接的是Azure认知搜索等原生支持search.in的服务,该报错通常是因为项目未引用对应服务的OData扩展包、或SDK版本过低,升级SDK、加载对应扩展的OData配置后即可正常识别该函数。
内容的提问来源于stack exchange,提问作者Castro
相关产品推荐
相关产品推荐

