3

我需要使用两个属性的组合来过滤结果列表。一个普通的 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但不知道如何组合名字和姓氏。
  • 我应该将 FullName 属性映射到映射类中的公式“FirstName + ' ' + LastName”吗?
  • 我应该在域对象上创建一个只读 FullName 属性,然后将其映射到列吗?
4

2 回答 2

13

您可以执行以下操作之一:


Session.CreateCriteria<Person>()
       .Add(Restrictions.Like(
            Projections.SqlFunction("concat",
                                    NHibernateUtil.String,
                                    Projections.Property("FirstName"),
                                    Projections.Constant(" "),
                                    Projections.Property("LastName")),
            term,
            MatchMode.Anywhere))
于 2010-05-30T00:37:31.670 回答
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);
于 2010-05-29T22:29:52.323 回答