我在 .NET 6 中執行以下查詢時遇到問題。
query = context.Where(user =>
user.Email.Contains(model.Email,
StringComparison.InvariantCultureIgnoreCase));
在搜索網路后,我了解到 EF Core 確實翻譯了 Contains 以進行服務器端評估 - 但不是接受 StringComparison.InvariantCultureIgnoreCase 或任何其他 StringComparison 的多載。但從未找到解決此問題的正確方法
所以我將查詢更改為如下內容以使其作業:
query = context.Where(user =>
user.Email.ToLower().Contains(model.Email.ToLower());
即使它正在作業,我對這個解決方案并不完全滿意,并且仍然想知道哪種解決方案最能解決我的問題。使用ToLowerInvariant()會是更好的解決方案嗎?有沒有更好的方法來解決這個問題?
更新
ToLowerInvariant() 不起作用并導致相同的錯誤 StringComparison.InvariantCultureIgnoreCase
uj5u.com熱心網友回復:
似乎您正在 DbSet 上撰寫 LINQ 查詢。這是不可能的,因為它不能被翻譯成 SQL 陳述句。
但是,您可以使用該EF.Functions.Like功能。這將被轉換為 SQL 提供程式,并且默認情況下不區分大小寫。
query = context.Where(user =>
EF.Functions.Like(user.Email, model.Email));
uj5u.com熱心網友回復:
您的查詢如何反應取決于您在服務器端設定的排序規則。畢竟,您的所有 linq 運算式都將被轉換為 SQL 查詢,并且如何解釋將取決于您的資料庫和列設定。
您可以嘗試在查詢中說明排序規則,例如
var customers = context.Customers
.Where(c => EF.Functions.Collate(c.Name, "latin1_general_ci collation") == "John")
.ToList();
//SQL_Latin1_General_CP1_CI_AS for SQL Server
//latin1_general_ci collation for MySQL
如Microsoft 檔案中所述。WhereCI代表不區分大小寫(與 相對CS)。請注意,Name由于自定義排序規則,此查詢將無法利用索引。所以最好在列(或表/資料庫)上定義它。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/405931.html
標籤:
