Лучшая практика для объединения параметров NHibernate.Search и ISession.Query<T>

У меня таблица выглядит так:

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 ответа

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

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

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

Другие вопросы по тегам