Лучшая практика для объединения NHibernate.Search и ISession.Query <T>Параметры - PullRequest
2 голосов
/ 26 марта 2011

У меня таблица выглядит следующим образом:

CREATE TABLE [dbo].[Order]( 
        [OrderID] [int] IDENTITY(1,1) NOT NULL, 
        [UserID] [int] NOT NULL, 
        [ProductID] [int] NOT NULL, 
        [OrderDate] [datetime] NOT NULL, 
        [UnitPrice] [money] NOT NULL, 
        [Quantity] [float] NOT NULL, 
        [Comment] [nvarchar](200) NULL, 
) ON [PRIMARY] 

Я использовал NHibernate для построения поиска по истории заказов, в то же время я также использую NHibernate.Search для поиска по полю комментария (из-за причины полнотекстового поиска).

Я мог бы создать запрос Linq для поиска по полям UserID, ProductID, OrderDate и т. Д.:

IQueryable<Order> orders = orderRecordRepository.GetList(); 
orders = orders.Where(o => o.User.Id == 1 && o.Product.Id == 100 && 
o.OrderDate <= DateTime.Now); 

Теперь у меня возникает вопрос, что если мне нужно включить поиск по полю комментариев, мне нужносоздать еще один полнотекстовый сеанс, например:

IFullTextSession fullTextSession = Search.CreateFullTextSession(this.session); 
return fullTextSession.CreateFullTextQuery<T>(fulltextQuery).List<T>();

Поведение первого запроса, похоже, изолированно от второго.если мне нужно найти порядок с UserID, ProductID, OrderDate + несколько текстов внутри комментариев, я должен выполнить 2 отдельных поиска, чтобы получить 2 разных списка, а затем найти перекрывающийся результат, чтобы получить окончательный список.Это кажется очень неэффективным.

Мне просто интересно, какова ваша практика в этой ситуации.

Ответы [ 2 ]

0 голосов
/ 31 марта 2011

Я бы добавил все поля, по которым я хочу выполнить запрос, в индекс Lucene, а затем просто запросил их с помощью полнотекстового поиска - недостатком является то, что вы теряете возможность запроса через Linq.

0 голосов
/ 27 марта 2011

Во-первых, насколько я понимаю из вашего первого запроса, вы извлекаете все Заказы из БД и фильтруете их только на прикладном уровне?это не очень эффективно.
Вы можете использовать Session.Query (в nH 3.0) или Session.Linq (с поставщиком nHibernate.Linq для более старых версий), чтобы выполнить фильтрацию на уровне БД.
И, чтобы ответитьВаш вопрос - вы можете использовать. Содержит в вашем запросе Linq для поиска по тексту.

    IQueryable<Order> orders = session.Query<Order>; 
orders = orders.Where(o => o.User.Id == 1 && o.Product.Id == 100 && 
o.OrderDate <= DateTime.Now && o.Comments.Contains("kuku"));

надеюсь, это поможет

...