我正在使用 EF,我想搜索欄位名稱,此搜索必須忽略字符 - 和空格和大小寫
在我的桌子上我有
id Name
1 Jean -philippe
當我讓我的resqust搜索某個時候我有jeanphilippe一些時間jean philippe
我需要將其與 db 上的記錄相匹配,例如:
await repository.FindAsync(m=>m.Name.ToLower().Replace("-", string.Empty).Trim()==request.Name.ToLower().Replace("-", string.Empty).Trim())
public async Task<User> FindAsync(Expression<Func<User, bool>> match)
{
return await _databaseContext.user.FirstOrDefaultAsync(match).ConfigureAwait(false);
}
但我有 EF 錯誤
The LINQ expression 'DbSet<user> where (.....) could not be translated.
請問我該如何解決?
uj5u.com熱心網友回復:
一切都將在服務器端完成,因此搜索是否區分大小寫,將由資料庫整理決定。
也許要忽略這些事情,您應該將搜索詞全部拆分為空格,并為每個和所有這些詞發送一個類似的陳述句。也許像這樣的草圖:
var name = "Foo -Bar";
var cleanedName = name
//.Replace(".", string.Empty) // Maybe other characters to remove before search
.Replace("-", string.Empty);
var elements = cleanedName.Split();
IQueryable<Foo> query = respository.Foo;
foreach (var element in elements)
{
query = query.Where(foo => EF.Functions.Like(foo.Name, $"%{element}%"));
}
var results = await query.ToListAsync();
請注意,這只是一個草圖。特別是直接使用element可能會產生錯誤的結果,如果用戶輸入的搜索詞包含由LIKE資料庫功能解釋的字符,如%、_、[或](可能更多)。
還要注意,在LIKE表上執行一堆陳述句可能包含大量包含大量文本的行可能會導致 SQL 資料庫的大量處理時間。不要忘記測量性能,如果需要,可以檢查服務器端的一些全文索引以提高性能。
uj5u.com熱心網友回復:
簡單的答案是 EF 抱怨它無法將您的查詢轉換為 SQL(因為這就是 EF 試圖對您傳遞給它的任何運算式執行的操作)。如果您可以用 SQL 撰寫查詢,那么您可能會找到一種方法將其轉換為 C# 代碼,該代碼將被轉換回等效的 SQL。或者只是使用存盤程序。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/324828.html
上一篇:ARMGCC產生未對齊的STRD
