我有一个看起来像这样的实体:
public class Media
{
public virtual string Caption { get; set; }
public virtual string Description { get; set; }
public virtual string Notes { get; set; }
}
我想要做的是让用户能够在Caption
,Description
和Notes
属性上搜索多个关键字。换句话说,如果用户搜索“ 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兼容?
答案 0 :(得分:3)
请记住,即使你弄清楚如何用Linq最佳地做你想做的事情,它仍然基本上被翻译成一个SQL语句,通过定义看起来如下:
(标题LIKE'%apple%'和Caption LIKE'%banana'%)或(描述LIKE'%apple%'和描述LIKE'%banana%')..等等
当然,次优方法可能会导致返回每条记录,然后在本地评估条件。
我的建议是研究NHibernate.Search,它使用Lucene索引引擎作为后端。我认为它会更符合您的目标。