實體框架核心 - 包含區分大小寫還是不區分大小寫?

c# database entity-framework-core linq postgresql

Entity Framework核心中的“Contains”應該等同於%%​​運算符的SQL%。因此“Contains”應該不區分大小寫,但它區分大小寫! (至少在postgres ????)

以下僅在使用正確的關鍵字大小寫時輸出結果。

context.Counties.Where(x => x.Name.Contains(keyword)).ToList();

我究竟做錯了什麼?

熱門答案

過去曾經是舊版EF核心的情況。現在string.Contains區分大小寫,例如對於sqlite,它映射到sqlite函數`instr()'(我不知道對於postgresql)。

如果要以不區分大小寫的方式比較字符串,則可以使用DbFunction來執行作業。

context.Counties.Where(x => EF.Functions.Like(x.Name, $"%{keyword}%")).ToList();

更新@Gert:

問題中的部分假設是不正確的。 string.Contains不會轉換為LIKE expression即使它在ef核心版本<= 1.0(我認為)中也是如此。

  • SQLServer中, string.contains轉換為CHARINDEX() ,在oraclesqlite中轉換為instr() ,默認情況下區分大小寫UNLESS db或者列collation是否定義(再次,我不知道postgresql)。
  • 在所有情況下, EF.Functions.Like()轉換為SQL LIKE表達式,默認情況下不區分大小寫,除非另外定義了db或列排序規則。

所以是的,這一切都歸結為整理但是 - 如果我錯了,請糾正我 - 在某種程度上,代碼會對區分大小寫/不敏感的搜索產生影響,具體取決於您使用上述哪種方法。

現在,我可能不完全是最新的,但我不認為EF核心遷移自然會處理數據庫歸類,除非你已經手動創建了表,否則最終會得到默認的歸類(對於sqlite和我來說區分大小寫)老實說,不知道其他人)。

回到原始問題,如果未來版本中沒有3個,則至少有2個選項可以執行此不區分大小寫的搜索:

  1. 使用DbContext.OnModelCreating()使用此技巧指定創建時的列排序規則
  2. 替換你的string.ContainsEF.Functions.Like()
  3. 或者等待討論中有前途的功能: EF.Functions.Collate()函數


Related

許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow