如何使用LINQ在NHibernate 3中实现关键字搜索?

时间:2010-12-30 20:14:05

标签: c# sql linq nhibernate fluent-nhibernate

我有一个看起来像这样的实体:

public class Media
{
    public virtual string Caption { get; set; }
    public virtual string Description { get; set; }
    public virtual string Notes { get; set; }
}

我想要做的是让用户能够在CaptionDescriptionNotes属性上搜索多个关键字。换句话说,如果用户搜索“ apple banana ”,则应搜索三个字符串属性以查看其中是否包含“ 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兼容?

1 个答案:

答案 0 :(得分:3)

请记住,即使你弄清楚如何用Linq最佳地做你想做的事情,它仍然基本上被翻译成一个SQL语句,通过定义看起来如下:

(标题LIKE'%apple%'和Caption LIKE'%banana'%)或(描述LIKE'%apple%'和描述LIKE'%banana%')..等等

当然,次优方法可能会导致返回每条记录,然后在本地评估条件。

我的建议是研究NHibernate.Search,它使用Lucene索引引擎作为后端。我认为它会更符合您的目标。