Entity Framework Core 大小写敏感处理

这篇具有很好参考价值的文章主要介绍了Entity Framework Core 大小写敏感处理。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

 

可以使用'StringComparison'吗?

在数据库查询操作中,不可避免去考虑字母大小写的问题,比如要在Movie表中查找“X-Men”这部电影,为了不区分字母大小写,按照Linq to memory的习惯,可能会写出如下代码:

DbContext.DbSet<Movie>
  .Where(item => string.Equals(item.Title, "X-Men", StringComparison.InvariantCultureIgnoreCase)

但是上述代码执行会报错,提示 'StringComparison'参数不支持。

InvalidOperationException: The LINQ expression 'DbSet<Movie>() .Where(m => string.Equals( a: m.Genre, b: __MovieGenre_0, comparisonType: InvariantCultureIgnoreCase))' could not be translated. 
Additional information: Translation of the 'string.Equals' overload with a 'StringComparison' parameter is not supported. 
See https://go.microsoft.com/fwlink/?linkid=2129535 for more information. 
Either rewrite the query in a form that can be translated, or switch to client evaluation explicitly by inserting a call to 'AsEnumerable', 'AsAsyncEnumerable', 'ToList', or 'ToListAsync'. 
See https://go.microsoft.com/fwlink/?linkid=2101038 for more information.

怎么解决这个问题呢?如果你用的是SQL server或MySQL,那么很简单,去掉“StringComparison.InvariantCultureIgnoreCase”这个参数就可以了,因为他们是默认大小写不敏感的。如果用的是大小写敏感的数据库,比如PostgreSQL,就需要做一些特殊处理了,后面会讲到。

对于这类问题有一个暴力的解决方法,就是按报错提示的那样在查询客户端做筛选:

DbContext.DbSet<Movie>
  .ToList()
  .Where(item => string.Equals(item.Title, "X-Men", StringComparison.InvariantCultureIgnoreCase)

这样做的本质是返回所有的Movie,然后在内存中做Title匹配查询(Linq to memory),而不是在DB中做Title的匹配查询,所以不会报 'StringComparison'参数不支持的错误。这种方法在绝大多数场景下是不推荐的,因为 1. 性能差,查询是在内存中不是在DB中,2. 占用内存,返回了整张表

 

为什么不能使用'StringComparison'?

前面讲到有的数据库是默认大小写不敏感的:SQL server,MySQL;有的数据库是默认大小写敏感的:PostgreSQL。那么数据库中大小写敏感与否是由什么控制的呢,排序规则(Collation,一组规则,用于确定文本值的排序和相等性比较方式,可以在数据库,表和列上创建排序规则,排序规则是隐式继承的,比如在数据库上创建了排序规则,没有在表上创建排序规则,那么表会默认使用数据库的排序规则,列同理)。因为EF core不知道数据库,表,列支持/应用了什么样的排序规则,所以'StringComparison'是没有意义的,EF core会将  string.Equals 转化成数据库的相等( = )操作,由数据库根据列上应用的排序规则来决定是否区分大小写。

 

如何在查询中设置区分大小写与否?

既然区分大小写是由排序规则决定的,我们可以通过在查询中指定排序规则的方式来来设置是否区分大小写,例如SQL Server默认是不区分大小写的,我们可以通过 EF.Functions.Collate 来指定一个大小写敏感的排序规则"SQL_Latin1_General_CP1_CS_AS"来达到精确匹配的目的

DbContext.DbSet<Movie>
    .Where(m => EF.Functions.Collate(item.Title, "SQL_Latin1_General_CP1_CS_AS") == "X-Men")

但是这种显示指定排序规则的方法也不是非常推荐的,因为他会导致索引匹配失败,进而影响查询性能。索引隐式继承列上的排序规则,当显示指定的排序规则和创建索引时指定的排序规则(PostgreSQL支持在创建索引时指定排序规则)或列的排序规则不一致时,会导致索引匹配失败,进而导致查询不能应用索引,这也是EF Core没有将'StringComparison'转换成排序规则的另一个原因。

因此一个相对完善的解决方案是,根据业务模型在列上指定合适的排序规则,而不是在代码中设置。如果数据库支持在列上创建多个索引,你也可以用显示指定排序规则的方式根据业务场景切换排序规则来匹配正确的索引。

 

参考文档:

https://learn.microsoft.com/en-us/ef/core/miscellaneous/collations-and-case-sensitivity

https://learn.microsoft.com/en-us/sql/relational-databases/collations/collation-and-unicode-support?view=sql-server-ver16

https://www.postgresql.org/docs/current/collation.html文章来源地址https://www.toymoban.com/news/detail-411835.html

到了这里,关于Entity Framework Core 大小写敏感处理的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 解决MySQL 8.0以上版本设置大小写不敏感的问题

            MySQL 8.0以上版本默认区分大小写,但在低版本(如5.7)中,可以通过在my.cnf配置文件的[mysqld]节下添加lower_case_table_names=1来设置大小写不敏感。然而,在MySQL 8.0以上版本中,添加此配置可能导致MySQL服务无法启动。本篇博客将介绍如何解决MySQL 8.0以上版本设置大小

    2024年02月02日
    浏览(29)
  • 解决mysql8.0 lower_case_table_names 大小写敏感设置问题

    lower_case_table_names=1 表示 mysql 是不区分大小写的 lower_case_table_names=0 表示 mysql 是区分大小写的 根据网上资料得知mysql8.0之后,lower_case_table_names 配置必须在安装好 MySQL 后,初始化 mysql 配置时才有效。一旦 mysql 启动后,再设置是无效的,而且启动报错。 需要重新初始化MySQL数据

    2024年02月15日
    浏览(33)
  • git怎么处理文件夹名称大小写重命名问题

    比如提交代码的时候不小心把文件名 kaimo 命名成了首字母大写的 Kaimo ,并且提交到了 git 仓库里面 这个时候我们把手动把 Kaimo 文件夹改成首字母小写的 kaimo 我们发现 git 并没有提示该文件重命名了 第一步:设置 git 的大小写敏感 可以使用命令 或者找到项目的隐藏文件夹

    2024年02月06日
    浏览(34)
  • 接口请求与对象转json中字段大小写的处理

    》前端请求对象字段为大写 》后端接受对象字段也为大写 前后端对象字段一模一样,就是接受不到前端传过来的值,针对这种情况,只需在后端对象中加 @JsonProperty(\\\"Id\\\") 即可 如下所示: 1)通过 com.fasterxml.jackson.databind.ObjectMapper 去转换,具体代码如下 2、 第二种通过gson去转

    2024年04月23日
    浏览(26)
  • java中字母、字符串,输入小写输出大写,输入大写输出小写、大小写转换

    思路: 1、利用“大小写字母之间正好相差32”这一特点                                                       2、用  toLowerCase()、toUpperCase() 字符串自带的方法  提示: Java中没有.nextChar()。 所以要读取char,我们使用  .next().charAt(0)  1、 输入小写输

    2024年02月07日
    浏览(51)
  • Python 大小写转换

    1.lower() 将字符串中的大写字母转换成小写字母 语法:str.lower() 2.upper() 将字符串的小写字母转换为大写字母 语法:str.upper() 3.capitalize() 将字符串的第一个字母变成大写,其余字母变为小写。 语法:str.capitalize()   4.title() 返回一个满足标题格式的字符串,即所有英文单词首字

    2024年02月13日
    浏览(53)
  • MySQL:区分大小写

    本文有点不准,仅作参考;可以使用MySQL的大小写相互转换,再拼接or来规避 查看MySQL版本 show variables;  1、查看 MySQL 当前的区分大小写设置: SHOW VARIABLES LIKE \\\'lower_case_table_names\\\'; 或者 show Variables like \\\'%table_names\\\' 2、更改大小写敏感设置: 在 MySQL 5.7 中,更改大小写敏感设置要

    2024年02月03日
    浏览(53)
  • hive查询区分大小写

    在Hive中,默认情况下,字段名是不区分大小写的,这意味着在查询中使用大写或小写字母来引用字段名称都是可以的。其实mysql也是一样的,大部分都不会区分大小写。 但是在部分业务场景时需要对这类数据进行处理,有这么几个方法可以尝试尝试。 启用此模式后,Hive将严

    2024年02月13日
    浏览(34)
  • Git 忽略文件大小写

    ⏹ 遇到的情况 git提交文件的时候,默认是 不区分 大小写更改的, 这样会导致修改文件名大小写后,git提交不生效,导致代码运行失效。 也就是说默认情况下,在Git看来 SEB001.java 和 seb001.java 其实是一个文件 ⏹ 解决 使用如下命令行忽略大小写即可。 git config core.ignorecase

    2024年02月08日
    浏览(39)
  • 【ElasticSearch查询忽略大小写】

    ElasticSearch查询忽略大小写 1、常用文档类型(数据查询字段) 2、问题解决思路 2.1 查看当前索引下是否进行分词 在Kinaba中执行上述语句,结果如下: token 就是对应的分词后的结果(此处是我已经设置完了的,所以虽然存储之前是大写TEST,但是经过处理后存储的索引结果是小

    2024年02月03日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包