Справка по запросу LINQ to SQL (строка содержит любую строку в массиве строк) - PullRequest
6 голосов
/ 07 сентября 2010

Я рвал на себе волосы этим. У меня есть массив поисковых терминов, и я пытаюсь выполнить запрос LINQ to SQL для поиска значений полей по каждому элементу в массиве.

Я получил это далеко ..

var searchResults = 
    from x in SDC.Staff_Persons
    where staffTermArray.Any(pinq => x.Forename.Contains(pinq))
        || staffTermArray.Any(pinq => x.Surname.Contains(pinq))
        || staffTermArray.Any(pinq => x.Known_as.Contains(pinq))
    orderby x.Surname
    select x;

... но потом получил

Локальная последовательность не может быть использована в LINQ выполнение запроса в SQL операторы, кроме Contains () оператор

... а теперь я застрял.

Если кто-нибудь может помочь, я был бы очень благодарен. Заранее спасибо.

Rob

Ответы [ 2 ]

6 голосов
/ 07 сентября 2010

Я не уверен, что это самое простое решение, но это будет работать:

var filter = CreateFilter(staffTermArray);

var searchResults = 
    from person in SDC.Staff_Persons.Where(filter)
    orderby person.Surname
    select person;



private static Expression<Func<Staff_Person, bool>> CreateFilter(
    string[] staffTermArray)
{
    var predicate = PredicateBuilder.False<Staff_Person>();

    foreach (var staffTerm in staffTermArray)
    {
       // We need to make a local copy because of C# weirdness.
       var ping = staffTerm;

       predicate = predicate.Or(p => p.Forename.Contains(ping));
       predicate = predicate.Or(p => p.Surname.Contains(ping));
       predicate = predicate.Or(p => p.Known_as.Contains(ping));
    }

    return predicate;
}

Вам понадобится PredicateBuilder , чтобы это работало.

0 голосов
/ 07 сентября 2010

Одним из вариантов будет фильтрация на клиенте, а не в SQL.Вы можете принудительно оценить where на клиенте, вызвав AsEnumerable().Однако это означает, что каждая строка таблицы загружается в память перед проверкой на совпадение, поэтому она может быть неприемлемо неэффективной, если ваш поиск соответствует только небольшому количеству результатов из большой таблицы.

var allPersons = 
    from x in SDC.Staff_Persons
    orderby x.Surname
    select x;

var searchResults = 
    from x in allPersons.AsEnumerable()
    where staffTermArray.Any(pinq => x.Forename.Contains(pinq))
        || staffTermArray.Any(pinq => x.Surname.Contains(pinq))
        || staffTermArray.Any(pinq => x.Known_as.Contains(pinq))
    select x;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...