Поисковые строки с Linq? - PullRequest
0 голосов
/ 21 июля 2011

Привет,

Мне нужно разрешить строку поиска типа конечного пользователя, например:

Volvo S70 ИЛИ S60 > Все сообщения, которые содержит VolvoИЛИ S70 ИЛИ S60

Volvo S70 НЕ S60 > Все сообщения, содержащие Volvo и S70, но не S60

"Volvo S70" > Все сообщенияэто включает "Volvo S70" в виде одной строки

Volvo S *> Все сообщения, содержащие Volvo и слово, начинающееся с S

"Volvo S70" "Volvo S60 "V *> Все сообщения, содержащие" Volvo S70 "или" Volvo S60 "или слово, начинающееся с V

Vo * l * S *> *, обрабатываютсякак подстановочные знаки, так и в этом случае сообщения, содержащие Vo * l * или S *

Это лишь малая часть возможных комбинаций.

Как мне справиться с этим с помощью Linq to Object?

Я знаю, что могу использовать StartsWith, EndsWith, Contains, но это будет означать, что мне придется разбивать входящую строку поиска, это единственный способ?И как мне тогда обрабатывать такие строки, как Vo * l *?

BestRegards

Edit1: Данные были получены из базы данных с помощью entityframework,это означает, что данные сейчас находятся в приложении (Список)

Ответы [ 4 ]

1 голос
/ 21 июля 2011

Если вы хотите раскрыть всю мощь текстового поиска, вы можете использовать Lucene.NET.Его не так просто настроить, но он дает вам много возможностей с полнотекстовым поиском и индексацией.Его также можно настроить для работы с LinqToEntities.

http://linqtolucene.codeplex.com/

1 голос
/ 21 июля 2011

Поскольку данные уже есть и в .NET нет ничего для обработки сложных строк поиска с помощью LINQ, мне интересно, будет ли создание собственного метода расширения запроса слишком далеко в нужном поле?

Я думаю, что вам лучше всего написать собственный синтаксический анализатор, который преобразует ваши правила поиска в регулярные выражения. Ваш синтаксис может быть слишком сложным для простой функциональности LIKE, и поиск по индексу невозможен, если вы не потратите время на использование Lucene, о котором я мало что знаю.

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

0 голосов
/ 29 июля 2011

Мое решение - использовать ESQL , например:

using (Entities context = new Entities())
      {
IQueryable<Ad> ads = context.CreateQuery<Ad>("SELECT VALUE C FROM Ads AS C WHERE C.Title LIKE @searchS OR C.Description LIKE @searchS", new ObjectParameter("searchS", searchS));

            ads = ads.Where(c => c.InactivatedDate.HasValue == inactive);
            ads = ads.Where(c => c.PublishedDate.HasValue && c.PublishedDate.Value.CompareTo(fetchAdsTo.Value) >= 1);

            output = ads.ToList();
}
0 голосов
/ 21 июля 2011

Если StartsWith, EndsWith, Contains недостаточно для вас.Вы можете использовать эту функцию

public ObjectQuery<T> Where( string predicate, params ObjectParameter[] parameters )

Вот так (можно использовать любой оператор sql):

ObjectQuery<Product> productQuery2 = productQuery1.Where("it.ProductID = @productID")

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