2015-07-26 4 views
1

У меня есть следующий код:Как использовать специальные символы для фильтрации результатов с помощью LINQ?

public IEnumerable<T> Enumerate<T>(IEnumerable<T> source, string searchField, string searchString, 
            bool searchEmpty) where T : class 
{ 
    if (source == null) throw new ArgumentNullException("source"); 

    if (searchField == null) throw new ArgumentNullException("searchField"); 

    if (searchString == null) throw new ArgumentNullException("searchString"); 

    return from item in source.AsParallel() 
      let property = item.GetType().GetProperties().Where(_ => 
       { 
        var searchFieldAttribute = 
         _.GetCustomAttributes(typeof (SearchFieldAttribute), false).SingleOrDefault() as 
         SearchFieldAttribute; 

        return searchFieldAttribute != null && Attribute.IsDefined(_, typeof (SearchFieldAttribute)) && 
          searchFieldAttribute.Name == searchField; 
       }).Single() 
      let value = property.GetValue(item, null) 
      let asString = value == null ? String.Empty : value.ToString() 
      where 
       searchEmpty && String.IsNullOrEmpty(asString) || 
       !searchEmpty && asString.ToLower().Contains(searchString.ToLower()) 
      select item; 
} 

Как вы можете видеть, я должен передать searchString параметр в этот метод и использовать его для поиска или фильтрации source коллекции, проверяя строковое представление значения свойства, содержит ли searchString.
Что следует улучшить в этом методе для использования специальных символов (таких как *, % и т. Д.), Которые обычно используются в поисковых запросах и LIKE операторов SQL. Есть ли какие-либо рекомендации, расширения или другие реализации метода Contains()? Любые советы и предложения будут с благодарностью оценены.

+2

'String' имеет' StartsWith' и 'EndsWith' методы, а также' Contains', которые соответствуют ведущему шаблону, завершающему подстановочный знак и т. Д. Соответственно. https://msdn.microsoft.com/en-us/library/System.String_methods(v=vs.110).aspx –

ответ

0

После некоторых попыток поиска я нашел решение на языке VB.NET.
Существует Operators.LikeString метод, который позволяет делать сопоставления по шаблону, поэтому положение where следует переписать следующим образом:

where 
    searchEmpty && String.IsNullOrEmpty(asString) || 
    !searchEmpty && Operators.LikeString(asString.ToLower(), searchString.ToLower(), CompareMethod.Text) 

и пользователи будут иметь возможности использовать специальные символы в своих запросах. Спасибо за внимание.

NB.Microsoft.VisualBasic и Microsoft.VisualBasic.CompilerServices.

 Смежные вопросы

  • Нет связанных вопросов^_^