如何使用 LINQ 在 NHibernate 3 中实现关键字搜索?
Posted
技术标签:
【中文标题】如何使用 LINQ 在 NHibernate 3 中实现关键字搜索?【英文标题】:How do I implement keyword searching in NHibernate 3 using LINQ? 【发布时间】:2010-12-30 20:14:05 【问题描述】:我有一个看起来像这样的实体:
public class Media
public virtual string Caption get; set;
public virtual string Description get; set;
public virtual string Notes get; set;
我想做的是让用户能够在Caption
、Description
和Notes
属性上搜索多个关键字。换句话说,如果用户搜索 'applebanana',它应该搜索三个字符串属性,看看它们中是否有任何一个包含 'apple' 和 '香蕉'。
我尝试了以下 LINQ 语句作为测试:
var query = new[] "apple", "banana" ;
// GetAll<T> returns an IQueryable<T>
repo.GetAll<Media>().Where(x => query.All(x.Caption.Contains));
但我遇到了一个例外:
ArgumentException:“System.Linq.Expressions.UnaryExpression 类型的对象”无法转换为“System.Linq.Expressions.LambdaExpression”类型。
我知道 NHib 3.0 的 LINQ 提供程序并没有实现 LINQ 的所有功能。我将如何重写此 LINQ 查询以使其与 NHibernate LINQ 兼容?
【问题讨论】:
你检查了 PredicateBuilder 吗? 【参考方案1】:请记住,即使您知道如何以最佳方式使用 Linq 做您想做的事,它本质上仍将被翻译成 SQL 语句,按照定义,该语句将如下所示:
(Caption LIKE '%apple%' AND Caption LIKE '%banana'%) OR (Description LIKE '%apple%' AND Description LIKE '%banana%')..etc
当然,次优方法可能会导致返回每条记录,然后在本地评估条件。
我的建议是研究 NHibernate.Search,它使用 Lucene 索引引擎作为后端。我认为它会更符合您的目标。
【讨论】:
谢谢。如果我们有大量数据,Lucene 将是一个很好的解决方案,但目前我们的要求是能够通过非常简单的搜索功能处理最多几百行。以上是关于如何使用 LINQ 在 NHibernate 3 中实现关键字搜索?的主要内容,如果未能解决你的问题,请参考以下文章
在 NHibernate 3.0 Linq 中急切加载多个兄弟姐妹和孙辈(堂兄弟?)的良好行为
使用 NHibernate 3.0 QueryOver 或 LINQ 提供程序的权衡
Linq Projection 在 NHibernate 3.2 中被错误地缓存