组合NHibernate.Search和ISession.Query <t>选项</t>的最佳实践

时间:2011-03-26 14:48:31

标签: nhibernate nhibernate.search

我的表格如下:

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搜索Comment字段(由于完整 文字搜索原因)。

我可以构建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 :(得分:0)

首先,正如我从您的第一个查询中了解到的那样,您从数据库中检索所有订单并仅在应用程序层过滤它们?这不是很有效。
您可以使用Session.Query(在nH 3.0中)或Session.Linq(在旧版本中使用nHibernate.Linq提供程序)在数据库级别进行过滤。
并且,要回答您的问题 - 您可以在Linq查询中使用.Contains来根据文本进行搜索。

    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"));

希望这会有所帮助

答案 1 :(得分:0)

我会将要查询的所有字段添加到Lucene索引中,然后使用全文搜索进行查询 - 缺点是您无法通过Linq进行查询。