OData查询$filter条件和大小写敏感性

31

OData规定了字符串字段上的筛选条件是区分大小写还是不区分大小写吗?

示例:(来自文档)

/Suppliers?$filter=Address/City eq 'Redmond' 

这个是否区分大小写?

如果我想要提供两种选项,该怎么表达?可以使用一个名为 tolower() 的函数:

/Suppliers?$filter=tolower(Address/City) eq 'redmond'
或者
/Suppliers?$filter=tolower(Address/City) eq tolower('Redmond')

有没有更简洁的方法来表达不区分大小写的匹配?


我在使用 tolower 函数处理 Contact 实体中的 EMailAddress1 字段时遇到了以下错误:无效的 'where' 条件。实体成员正在调用无效的属性或方法。 有什么想法吗? - Zaid Masud
3个回答

36

"eq"运算符应该区分大小写。目前推荐的做法是使用tolower(或toupper)。


1
我在使用 tolower 函数处理 Contact 实体中的 EMailAddress1 字段时遇到了以下错误:无效的 'where' 条件。实体成员正在调用无效的属性或方法。 有什么想法吗? - Zaid Masud
怎么做呢?需要示例。 - Mike
1
@Mike - 这是一个例子:/people?$filter=tolower(Name) eq tolower('JAmes') - 这应该会给你所有名字为'James'的人(或Person对象)(不区分大小写,可以是'JAMES','james','JamES'等)。希望这能帮到你 :) - Yulian
这个能和其他运算符一起使用吗,比如 stringof - zygimantus
1
在使用 tolower 与 IQueryable 和 Entity Framework 结合的请求时要小心。当查询大量数据时,LOWER 会导致性能下降。 - Alexander

1
我认为这取决于您的数据库排序设置,因为OData服务只是执行查询。 如果Vitek的答案是正确的,那么OData正在对结果集进行一些后置查询过滤,这应该是奇怪的,对吗?

这适用于许多IQueryable<T>实现,它们将查询传递到底层SQL提供程序,但规范根本没有提到大小写敏感性,因此行为将严重依赖于实现,在这种情况下,OP没有提供任何实现细节。 - Chris Schaller

0

它不依赖于数据库。即使您以不区分大小写的方式对数据库执行查询,OData也会进行自己的附加过滤并过滤掉您的数据。


1
这是具有误导性的,规范根本没有提到大小写敏感性,大小写和接受敏感性完全取决于实现。 - Chris Schaller

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接