2009-05-22 23 views
4

データベースにアクセスするためにwebserviceとLinq To Sqlを使用してオートコンプリート検索を実行しようとしています。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(); 
+0

結果は第2、第3などの用語に一致しません。それは少し醜いですが、その速さは十分です。まだ提案がありません。 – KClough

答えて

1

私はlinqを使って最初の言葉を検索していましたが、複数の言葉があるとしました。私は改善/最適化について開いています。私は今、私はこの方法に最初の検索ターム過去のためのLINQで検索し、1以上の検索語が存在する場合、私は、DBとフィルタから最初の結果を使用して、理想的なソリューションよりも少ないと考え

//... 
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; 
} 
0

私は、LINQ to SQLのを知りませんが、あなたが結果に追加されなければならないときは、各ループのためにあなたに結果を再割り当てされているように見えます。

+0

私は結果をフィルタリングしようとしています。 擬似コード: 最初のループ: Results.Where xが意味をなす '123' 第二のループ 結果(x 'は123' が含まれている場合)(x 'は456' に含まれている場合) んが含まれていますか? – KClough

関連する問題