如何编写 OData 查询来过滤深度为 2 展开的属性?

问题描述 投票:0回答:1

我正在尝试编写一个 OData 查询,如下所示:

var queryUrl = serviceURL + 'Thing1Thing2RelationTable?$expand=Thing1($select=ID,DisplayName;$expand=Attribute)&$filter=Thing2ID eq ' + selectedThing2ID + ' and Thing1/Attribute/Type in (\'Decimal\', \'Float\', \'Money\', \'BigInt\', \'Int\', \'SmallInt\')&$orderby=Thing1/DisplayName';

这不起作用。这部分有些问题,因为如果我删除它,查询就会工作:

and Thing1/Attribute/Type in (\'Decimal\', \'Float\', \'Money\', \'BigInt\', \'Int\', \'SmallInt\')

我不断在“in”一词周围出现语法错误。

(需要明确的是,属性是合法的属性名称,我并不是无意中尝试以一种时髦的方式引用数据库列。)

对我来说,这应该可行,因为这里相关的所有内容都具有 1:1 关系:Thing1Thing2RelationTable 中的一行只有一个 Thing1,Thing1 只有一个属性,而属性只有 1 个类型。

希望这里的结果很清楚:我希望每个返回的项目都是一个关系对象,其中包含一个 Thing1 对象,该对象包含一个类型为指定值之一的属性。

正如我所说,如果我删除过滤器的有问题的部分,查询就会工作,但随后我需要使用前端代码删除一些返回的值,这是我想避免的。

我也尝试过仅使用

Attribute\Type
而不是
Thing1\Attribute\Type
,但这也不起作用(相同的语法错误)。

也许这里有一些曲折的解决方法,因为我实际上不需要关系表中的行。我只需要参考关系表,以便可以按 selectedThing2ID 进行过滤。过滤完成后,我需要的唯一数据是每个 Thing1 的一些属性以及 Thing1 相应属性的一些属性。 (一旦我让它工作,我将用更多的选择来优化查询。)如果这是 SQL,那么通过利用 JOIN 来获得我想要的东西会相对容易,但我不知道如何使这个 OData 查询工作。

针对我想要的功能运行 SQL,供参考(但正如我所说,为了提高效率,需要稍后添加一些选择):

select * from (
    Thing1Thing2 t1t2
    join (
        Thing1 t1
        join Attributes a
        on t1.AttributeID = a.ID
    )
    on t1t2.t1ID = t1.ID
) where a.[Type] in ('BigInt','Int','SmallInt','Float','Money')
javascript odata
1个回答
0
投票

参见:https://github.com/xuzhg/WebApiSample/tree/main/v8.x/FilterOnTwoExpandDeepProperty

看起来它在我的样品中效果很好。

如有其他问题请告诉我。

© www.soinside.com 2019 - 2024. All rights reserved.