2

我有一张桌子看起来像:

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 + Comments 中的一些文本搜索订单,我必须执行 2 次单独的搜索以获得 2 个不同的列表,然后找到重叠的结果以获得最终列表。似乎效率很低。

我只是想知道你在这种情况下的做法是什么。

4

2 回答 2

0

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

于 2011-03-31T05:09:54.067 回答
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"));

希望这可以帮助

于 2011-03-27T10:46:13.387 回答