我在資料庫中保存了以下物體:
我在資料庫中保存了以下物體。
public class Company
{
public string FullName {get; set; }
}
屬性FullName可能包含以下資料。
"Contoso" Ltd或者只是Contoso。我使用的是EF Core,我想用這個屬性通過短名稱來過濾資料。我的意思是,如果我有"Contoso "有限公司的記錄保存在資料庫中,用戶將搜索ltd,搜索結果將是空的。
為此,我嘗試使用以下LINQ運算式:
var result = context.Company.Where(c => c.FullName.ExtractShortNameExtension() .Contains(filterString))。
與一個擴展方法的組合:
public static string ExtractShortNameExtension(this string name)
{
int firstQuotes = name.IndexOf('")。
int lastQuotes = name.LastIndexOf('"')。
if (firstQuotes == -1 || firstQuotes == lastQuotes)
{
return name。
}
return name.Substring(firstQuotes 1, lastQuotes - firstQuotes - 1) 。
}
但是我得到System.InvalidOperationException,因為LINQ無法翻譯運算式。我試著使用Nein LINQ,但它并沒有幫助我,我有同樣的例外。
我意識到使用SqlFunctions類可能會幫助我解決這個問題,但我想避免它,因為我想保留將我的代碼用于其他型別的資料庫的可能性。
uj5u.com熱心網友回復:
EF必須將運算式翻譯成SQL。做這樣的事情的一般方法是在領域邏輯中使用物體中的非映射屬性,或者更好的是在視圖模型中保留它:
public class Company
{
public string FullName {get; set; }
[]。
public string ShortName
{
get { return FullName.ExtensionShortName(); }
}
這對你的Where子句沒有幫助。這需要將你的過濾程序表達為SQL能夠理解的東西。一個開始是 "我如何用這個資料在SQL中寫一個合適的搜索?"
首先,默認情況下應該避免使用字串Contains搜索,因為這些搜索會轉化為LIKE %term%,而這總是效率很低。在全名上默認為BeginsWith將是一個開始:
var result = context.Company.Where(c => c.FullName.BeginsWith(filterString))。
這對 "Contonso "或 "Cont "有效,但對 "Ltd "無效。然而,它不會與 "tonso "匹配,盡管第一個問題是 "它需要這樣做嗎?"。如果99%的用戶希望知道他們正在搜索的公司名稱的前幾個字符,那么通過簡單、快速的查詢來滿足這個要求就足夠了,還是引入更復雜、更慢的東西來強加給每一個搜索,以滿足可能1%的搜索?
如果有人正在搜索一個多字的特定公司名稱,例如 "Contoso Verico Ltd",而他們在第一個字上沒有得到匹配,因為他們只記得 "Verico "這樣的詞,那么您可以在搜索中提供對全文搜索選項的支持,這將提供一個Contains型別的搜索。這將允許他們搜索 "Verico "或 "toso",或 "ltd"(如果你真的不想讓他們搜索,你總是可以過濾掉特定的關鍵詞),這將恢復到一個較慢的查詢,但它不是大多數搜索的默認選項。
為避免用戶因搜索所有內容而導致服務崩潰,搜索的其他關鍵考慮因素還包括:
Contains型別的搜索。
Take)對結果串列使用分頁,或者簡單地限制回傳的行數,例如自動完成。
uj5u.com熱心網友回復:
在Linq To Objects中,它可以作業,但是,使用Linq To Sql,它不會作業,因為想想你自己,這個函式呼叫(擴展方法)如何能被翻譯成有效的SQL陳述句?
你應該從context.Company dbSet中獲取第一個名字,然后在記憶體中定義它。對于示例:
var queryResult = context.Company.Where(c => c.FullName. Contains(filterString)).ToList();
var result = queryResult.Where(c => c.FullName.ExtractShortNameExtension(). Contains(filterString)).ToList()。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/327597.html
標籤:
