Linq To Sql Поиск нескольких столбцов и нескольких слов - PullRequest
4 голосов
/ 22 мая 2009

Я пытаюсь выполнить автозаполнение поиска, используя веб-сервис и 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();

Ответы [ 2 ]

1 голос
/ 16 июня 2009

Я закончил тем, что использовал 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;
}
0 голосов
/ 22 мая 2009

Я не знаю linq to sql, но похоже, что вы перераспределяете результаты в вашем для каждого цикла, когда вы должны добавлять результаты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...