Как правильно динамически добавлять неопределенное количество предложений в запрос Linq 2 Sql? - PullRequest
5 голосов
/ 15 сентября 2010

Эта функция используется для возврата списка контактов для пользовательского ввода.Количество поисковых терминов всегда равно как минимум одному, но может быть много.

public IList<Contact> GetContacts(string[] searchTerms)
{
    using (dbDataContext db = new dbDataContext())
    {
        var contacts = from _contacts in db.Contacts
                       orderby _contacts.LastName ascending, _contacts.FirstName ascending
                       select _contacts;

        foreach (string term in searchTerms)
        {
            contacts = (IOrderedQueryable<Contact>)contacts.Where(x => SqlMethods.Like(x.FirstName, "%" + term + "%")
                                                                    || SqlMethods.Like(x.MiddleName, "%" + term + "%")
                                                                    || SqlMethods.Like(x.LastName, "%" + term + "%")
                                                                    || SqlMethods.Like(x.PreferredName, "%" + term + "%"));
        }

        return contacts.ToList<Contact>();
    }
}

Проблема в цикле.Только последний поисковый термин когда-либо использовался, хотя сгенерированный sql выглядит корректно (как при правильном количестве предложений, сгенерированных для количества терминов).

Пример - если я пропущу два термина ('andr', 'sm'), сгенерированный sql показывает два блока предложений как ожидаемые, но использует только 'sm' в качестве параметра в обоих блоках.

Что я делаю неправильно?Должен ли я даже использовать SqlMethods?

1 Ответ

5 голосов
/ 15 сентября 2010

Возможно, проблема в захвате переменной цикла.Попробуйте это:

foreach (string term in searchTerms) 
{
    string t = term;  
    contacts = ... // use t instead of term
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...