[英]Linq To Sql Search Multiple Columns and Multiple Words
我正在嘗試使用Web服務和Linq To Sql進行自動完成搜索以訪問數據庫。
這是我的代碼。 這將返回與任何搜索詞匹配的結果,我想修改它,以便每個結果包含所有搜索詞。
我知道SQL全文搜索可能是最優雅的解決方案,但我想看看是否可以在不修改數據庫的情況下實現此功能。
string[] searchTerms = searchString.Split(new string[] { " " }, StringSplitOptions.RemoveEmptyEntries).ToArray();
IQueryable<AccountResult> results = db.cdAccounts
.Select(x =>
new AccountResult()
{
idAccount = x.id_Account,
AccountName = x.AccountNme,
AccountNumber = x.AccountNum
}).Distinct().OrderBy(x => x.AccountName);
foreach (string searchTerm in searchTerms)
results = results.Where(x => x.AccountName.Contains(searchTerm) || x.AccountNumber.Contains(searchTerm));
return results.OrderBy(x => x.AccountName).Take(40).ToList();
我最終使用linq搜索第一個術語,然后是否有多個術語。 我願意改進/優化。
//...
if (searchTerms.Count() > 1)
{
List<string> remainingSearchTerms = new List<string>();
for (int x = 1; x < searchTerms.Count(); x++)
remainingSearchTerms.Add(searchTerms[x]);
List<SearchResult> matchingResults = new List<SearchResult>();
foreach (SearchResult result in allResults)
if (MatchSearchTerms(new string[] { result.Name, result.Number, result.id.ToString() }, remainingSearchTerms.ToArray()))
matchingResults.Add(result);
return matchingResults.OrderBy(x => x.Name).Take(MaxResults).ToList();
}
else
return allResults.OrderBy(x => x.Name).Take(MaxResults).ToList();
//...
private bool MatchSearchTerms(string[] searchFields, string[] searchTerms)
{
bool match = true;
foreach (string searchTerm in searchTerms)
{
if (match)
{
bool fieldMatch = false;
foreach (string field in searchFields)
{
if (field.ToLower().Contains(searchTerm.ToLower()))
{
fieldMatch = true; //Only one field needs to match the term
break;
}
}
match = fieldMatch;
}
else
break;
}
return match;
}
我不知道linq到sql,但是當你應該追加結果時,看起來你正在為每個循環重新分配結果。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.