如何编写OData查询筛选两层Expand嵌套的属性?
正确的OData查询写法
修复原查询(解决in语法错误)
如果你的OData服务是V4版本,原查询的问题大概率是字符串拼接细节或格式问题,以下是修正后的代码:
var queryUrl = serviceURL + 'Thing1Thing2RelationTable?$expand=Thing1($select=ID,DisplayName;$expand=Attribute)&$filter=Thing2ID eq ' + (typeof selectedThing2ID === 'string' ? `'${selectedThing2ID}'` : selectedThing2ID) + ' and Thing1/Attribute/Type in (\'Decimal\',\'Float\',\'Money\',\'BigInt\',\'Int\',\'SmallInt\')&$orderby=Thing1/DisplayName';
注意:
- 若
selectedThing2ID是字符串类型,必须用单引号包裹;数字类型则不需要 - 导航属性路径必须用正斜杠
/,不要用反斜杠\(你之前尝试的Attribute\Type是错误写法)
如果你的OData服务是V3版本,由于V3不支持in操作符,需要用多个or条件替代:
var typeFilters = ['Decimal','Float','Money','BigInt','Int','SmallInt'].map(type => `Thing1/Attribute/Type eq '${type}'`).join(' or '); var queryUrl = serviceURL + 'Thing1Thing2RelationTable?$expand=Thing1($select=ID,DisplayName;$expand=Attribute)&$filter=Thing2ID eq ' + (typeof selectedThing2ID === 'string' ? `'${selectedThing2ID}'` : selectedThing2ID) + ' and (' + typeFilters + ')&$orderby=Thing1/DisplayName';
更优查询(直接获取Thing1数据,避免返回关联表)
既然你不需要关联表的行数据,直接查询Thing1实体,通过$filter关联关联表并筛选条件,能减少不必要的数据传输:
OData V4版本:
var queryUrl = serviceURL + 'Thing1?$select=ID,DisplayName&$expand=Attribute&$filter=Thing1Thing2RelationTable/any(r: r/Thing2ID eq ' + (typeof selectedThing2ID === 'string' ? `'${selectedThing2ID}'` : selectedThing2ID) + ') and Attribute/Type in (\'Decimal\',\'Float\',\'Money\',\'BigInt\',\'Int\',\'SmallInt\')&$orderby=DisplayName';
OData V3版本:
var typeFilters = ['Decimal','Float','Money','BigInt','Int','SmallInt'].map(type => `Attribute/Type eq '${type}'`).join(' or '); var queryUrl = serviceURL + 'Thing1?$select=ID,DisplayName&$expand=Attribute&$filter=Thing1Thing2RelationTable/any(r: r/Thing2ID eq ' + (typeof selectedThing2ID === 'string' ? `'${selectedThing2ID}'` : selectedThing2ID) + ') and (' + typeFilters + ')&$orderby=DisplayName';
关键说明
- 一对一关系下,OData允许直接通过导航属性路径(如
Thing1/Attribute/Type)进行筛选 - OData V3版本不支持
in操作符,必须用or拼接多个等值条件替代 - 直接查询目标实体(Thing1)更贴合你的需求,能降低数据传输量
内容的提问来源于stack exchange,提问作者ysi_d
相关产品推荐
相关产品推荐

