我的表格如下:
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 不同的列表,然后找到重叠的结果,以获得最终列表。它 似乎效率很低。
我只是想知道你在这种情况下的做法是什么。
答案 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进行查询。