国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Entity Framework Core 大小寫敏感處理

這篇具有很好參考價值的文章主要介紹了Entity Framework Core 大小寫敏感處理。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

?

可以使用'StringComparison'嗎?

在數(shù)據(jù)庫查詢操作中,不可避免去考慮字母大小寫的問題,比如要在Movie表中查找“X-Men”這部電影,為了不區(qū)分字母大小寫,按照Linq to memory的習慣,可能會寫出如下代碼:

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

但是上述代碼執(zhí)行會報錯,提示?'StringComparison'參數(shù)不支持。

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”這個參數(shù)就可以了,因為他們是默認大小寫不敏感的。如果用的是大小寫敏感的數(shù)據(jù)庫,比如PostgreSQL,就需要做一些特殊處理了,后面會講到。

對于這類問題有一個暴力的解決方法,就是按報錯提示的那樣在查詢客戶端做篩選:

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

這樣做的本質(zhì)是返回所有的Movie,然后在內(nèi)存中做Title匹配查詢(Linq to memory),而不是在DB中做Title的匹配查詢,所以不會報?'StringComparison'參數(shù)不支持的錯誤。這種方法在絕大多數(shù)場景下是不推薦的,因為 1. 性能差,查詢是在內(nèi)存中不是在DB中,2. 占用內(nèi)存,返回了整張表

?

為什么不能使用'StringComparison'?

前面講到有的數(shù)據(jù)庫是默認大小寫不敏感的:SQL server,MySQL;有的數(shù)據(jù)庫是默認大小寫敏感的:PostgreSQL。那么數(shù)據(jù)庫中大小寫敏感與否是由什么控制的呢,排序規(guī)則(Collation,一組規(guī)則,用于確定文本值的排序和相等性比較方式,可以在數(shù)據(jù)庫,表和列上創(chuàng)建排序規(guī)則,排序規(guī)則是隱式繼承的,比如在數(shù)據(jù)庫上創(chuàng)建了排序規(guī)則,沒有在表上創(chuàng)建排序規(guī)則,那么表會默認使用數(shù)據(jù)庫的排序規(guī)則,列同理)。因為EF core不知道數(shù)據(jù)庫,表,列支持/應(yīng)用了什么樣的排序規(guī)則,所以'StringComparison'是沒有意義的,EF core會將? string.Equals 轉(zhuǎn)化成數(shù)據(jù)庫的相等( = )操作,由數(shù)據(jù)庫根據(jù)列上應(yīng)用的排序規(guī)則來決定是否區(qū)分大小寫。

?

如何在查詢中設(shè)置區(qū)分大小寫與否?

既然區(qū)分大小寫是由排序規(guī)則決定的,我們可以通過在查詢中指定排序規(guī)則的方式來來設(shè)置是否區(qū)分大小寫,例如SQL Server默認是不區(qū)分大小寫的,我們可以通過 EF.Functions.Collate 來指定一個大小寫敏感的排序規(guī)則"SQL_Latin1_General_CP1_CS_AS"來達到精確匹配的目的

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

但是這種顯示指定排序規(guī)則的方法也不是非常推薦的,因為他會導(dǎo)致索引匹配失敗,進而影響查詢性能。索引隱式繼承列上的排序規(guī)則,當顯示指定的排序規(guī)則和創(chuàng)建索引時指定的排序規(guī)則(PostgreSQL支持在創(chuàng)建索引時指定排序規(guī)則)或列的排序規(guī)則不一致時,會導(dǎo)致索引匹配失敗,進而導(dǎo)致查詢不能應(yīng)用索引,這也是EF Core沒有將'StringComparison'轉(zhuǎn)換成排序規(guī)則的另一個原因。

因此一個相對完善的解決方案是,根據(jù)業(yè)務(wù)模型在列上指定合適的排序規(guī)則,而不是在代碼中設(shè)置。如果數(shù)據(jù)庫支持在列上創(chuàng)建多個索引,你也可以用顯示指定排序規(guī)則的方式根據(jù)業(yè)務(wù)場景切換排序規(guī)則來匹配正確的索引。

?

參考文檔:

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文章來源地址http://www.zghlxwxcb.cn/news/detail-411835.html

到了這里,關(guān)于Entity Framework Core 大小寫敏感處理的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔相關(guān)法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 解決MySQL 8.0以上版本設(shè)置大小寫不敏感的問題

    ????????MySQL 8.0以上版本默認區(qū)分大小寫,但在低版本(如5.7)中,可以通過在my.cnf配置文件的[mysqld]節(jié)下添加lower_case_table_names=1來設(shè)置大小寫不敏感。然而,在MySQL 8.0以上版本中,添加此配置可能導(dǎo)致MySQL服務(wù)無法啟動。本篇博客將介紹如何解決MySQL 8.0以上版本設(shè)置大小

    2024年02月02日
    瀏覽(36)
  • 解決mysql8.0 lower_case_table_names 大小寫敏感設(shè)置問題

    解決mysql8.0 lower_case_table_names 大小寫敏感設(shè)置問題

    lower_case_table_names=1 表示 mysql 是不區(qū)分大小寫的 lower_case_table_names=0 表示 mysql 是區(qū)分大小寫的 根據(jù)網(wǎng)上資料得知mysql8.0之后,lower_case_table_names 配置必須在安裝好 MySQL 后,初始化 mysql 配置時才有效。一旦 mysql 啟動后,再設(shè)置是無效的,而且啟動報錯。 需要重新初始化MySQL數(shù)據(jù)

    2024年02月15日
    瀏覽(20)
  • git怎么處理文件夾名稱大小寫重命名問題

    git怎么處理文件夾名稱大小寫重命名問題

    比如提交代碼的時候不小心把文件名 kaimo 命名成了首字母大寫的 Kaimo ,并且提交到了 git 倉庫里面 這個時候我們把手動把 Kaimo 文件夾改成首字母小寫的 kaimo 我們發(fā)現(xiàn) git 并沒有提示該文件重命名了 第一步:設(shè)置 git 的大小寫敏感 可以使用命令 或者找到項目的隱藏文件夾

    2024年02月06日
    瀏覽(59)
  • 接口請求與對象轉(zhuǎn)json中字段大小寫的處理

    》前端請求對象字段為大寫 》后端接受對象字段也為大寫 前后端對象字段一模一樣,就是接受不到前端傳過來的值,針對這種情況,只需在后端對象中加 @JsonProperty(\\\"Id\\\") 即可 如下所示: 1)通過 com.fasterxml.jackson.databind.ObjectMapper 去轉(zhuǎn)換,具體代碼如下 2、 第二種通過gson去轉(zhuǎn)

    2024年04月23日
    瀏覽(26)
  • java中字母、字符串,輸入小寫輸出大寫,輸入大寫輸出小寫、大小寫轉(zhuǎn)換

    思路: 1、利用“大小寫字母之間正好相差32”這一特點?????? ??????????????????????????????????????????????? 2、用? toLowerCase()、toUpperCase() 字符串自帶的方法 ?提示: Java中沒有.nextChar()。 所以要讀取char,我們使用 ?.next().charAt(0)? 1、 輸入小寫輸

    2024年02月07日
    瀏覽(242)
  • Python 大小寫轉(zhuǎn)換

    1.lower() 將字符串中的大寫字母轉(zhuǎn)換成小寫字母 語法:str.lower() 2.upper() 將字符串的小寫字母轉(zhuǎn)換為大寫字母 語法:str.upper() 3.capitalize() 將字符串的第一個字母變成大寫,其余字母變?yōu)樾憽?語法:str.capitalize() ? 4.title() 返回一個滿足標題格式的字符串,即所有英文單詞首字

    2024年02月13日
    瀏覽(97)
  • MySQL:區(qū)分大小寫

    MySQL:區(qū)分大小寫

    本文有點不準,僅作參考;可以使用MySQL的大小寫相互轉(zhuǎn)換,再拼接or來規(guī)避 查看MySQL版本?show variables;? 1、查看 MySQL 當前的區(qū)分大小寫設(shè)置: SHOW VARIABLES LIKE \\\'lower_case_table_names\\\'; 或者 show Variables like \\\'%table_names\\\' 2、更改大小寫敏感設(shè)置: 在 MySQL 5.7 中,更改大小寫敏感設(shè)置要

    2024年02月03日
    瀏覽(171)
  • 【ElasticSearch查詢忽略大小寫】

    ElasticSearch查詢忽略大小寫 1、常用文檔類型(數(shù)據(jù)查詢字段) 2、問題解決思路 2.1 查看當前索引下是否進行分詞 在Kinaba中執(zhí)行上述語句,結(jié)果如下: token 就是對應(yīng)的分詞后的結(jié)果(此處是我已經(jīng)設(shè)置完了的,所以雖然存儲之前是大寫TEST,但是經(jīng)過處理后存儲的索引結(jié)果是小

    2024年02月03日
    瀏覽(91)
  • Git 忽略文件大小寫

    ? 遇到的情況 git提交文件的時候,默認是 不區(qū)分 大小寫更改的, 這樣會導(dǎo)致修改文件名大小寫后,git提交不生效,導(dǎo)致代碼運行失效。 也就是說默認情況下,在Git看來 SEB001.java 和 seb001.java 其實是一個文件 ? 解決 使用如下命令行忽略大小寫即可。 git config core.ignorecase

    2024年02月08日
    瀏覽(106)
  • hive查詢區(qū)分大小寫

    在Hive中,默認情況下,字段名是不區(qū)分大小寫的,這意味著在查詢中使用大寫或小寫字母來引用字段名稱都是可以的。其實mysql也是一樣的,大部分都不會區(qū)分大小寫。 但是在部分業(yè)務(wù)場景時需要對這類數(shù)據(jù)進行處理,有這么幾個方法可以嘗試嘗試。 啟用此模式后,Hive將嚴

    2024年02月13日
    瀏覽(97)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包