我正在尝试编写一个 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')
参见:https://github.com/xuzhg/WebApiSample/tree/main/v8.x/FilterOnTwoExpandDeepProperty
看起来它在我的样品中效果很好。
如有其他问题请告诉我。