NHIBERNATE标准 - 如何过滤特性的组合
-
05-10-2019 - |
题
我需要使用两个属性的组合过滤结果列表。一个普通的SQL语句看起来像这样:
SELECT TOP 10 *
FROM Person
WHERE FirstName + ' ' + LastName LIKE '%' + @Term + '%'
我最终使用的nhibernate中的象征性是:
ICriteria criteria = Session.CreateCriteria(typeof(Person));
criteria.Add(Expression.Sql(
"FirstName + ' ' + LastName LIKE ?",
"%" + term + "%",
NHibernateUtil.String));
criteria.SetMaxResults(10);
它可以很好地工作,但是我不确定这是否是理想的解决方案,因为我仍在学习NHIBERNATE的标准API。推荐的替代方案是什么?
- 除了
Expression.Sql
那会执行相同的操作吗?我试过了Expression.Like
但是无法弄清楚如何组合名字和姓氏。 - 我应该将fullname属性映射到映射类中的公式“ firstName +'' + lastName”?
- 我应该在域对象上仅创建一个读取的fullName属性,然后将其映射到列?
解决方案
您可以做以下一个:
- 如果您始终使用全名,最好拥有一个属性
- 为此目的创建一个仅查询的属性(请参阅 http://ayende.com/blog/archive/2009/06/10/nhibernate-ndash-query-query-only-properties.aspx)
- 在HQL中进行查询,该查询更适合自由形式查询(可能与您的SQL几乎相同)
- 使用适当的基于实体的标准:
Session.CreateCriteria<Person>()
.Add(Restrictions.Like(
Projections.SqlFunction("concat",
NHibernateUtil.String,
Projections.Property("FirstName"),
Projections.Constant(" "),
Projections.Property("LastName")),
term,
MatchMode.Anywhere))
其他提示
在纯技术方面,我没有答案,但请考虑一下:由于您只有一个输入字段供用户输入该术语,因此您不知道他是否要输入“ 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);
不隶属于 StackOverflow