我需要使用两个属性的组合来过滤结果列表。一个普通的SQL语句如下所示:
SELECT TOP 10 *
FROM Person
WHERE FirstName + ' ' + LastName LIKE '%' + @Term + '%'
我最终使用的NHibernate中的ICriteria是:
ICriteria criteria = Session.CreateCriteria(typeof(Person));
criteria.Add(Expression.Sql(
"FirstName + ' ' + LastName LIKE ?",
"%" + term + "%",
NHibernateUtil.String));
criteria.SetMaxResults(10);
它完美无缺,但我不确定它是否是理想的解决方案,因为我还在学习NHibernate的Criteria API。推荐的替代品有哪些?
Expression.Sql
之外还有什么能够执行相同的操作吗?我试过Expression.Like
,但无法弄清楚如何组合名字和姓氏。答案 0 :(得分:13)
您可以执行以下操作之一:
Session.CreateCriteria<Person>()
.Add(Restrictions.Like(
Projections.SqlFunction("concat",
NHibernateUtil.String,
Projections.Property("FirstName"),
Projections.Constant(" "),
Projections.Property("LastName")),
term,
MatchMode.Anywhere))
答案 1 :(得分:0)
在纯技术方面,我没有答案,但请考虑一下: 由于您只有一个输入字段供用户输入该术语,您不知道他是否要输入'foo bar'或'bar foo'...所以我建议这样:
ICriteria criteria = Session.CreateCriteria(typeof(Person));
criteria.Add(Expression.Like("FirstName",term, MatchMode.Anywhere) || Expression.Like("LastName",term, MatchMode.Anywhere));
criteria.SetMaxResults(10);