小编典典

使用NHibernate对串联全名进行模糊搜索

sql

我正在尝试将以下SQL转换为NHibernate:

SELECT * FROM dbo.Customer
WHERE FirstName + ' ' + LastName LIKE '%' + 'bob smith' + '%'

我正在尝试做这样的事情,但它不起作用:

name = "%" + name + "%";

var customers = _session.QueryOver<Customer>()
            .Where(NHibernate.Criterion.Restrictions.On<Customer>(c => c.FirstName + ' ' + c.LastName).IsLike(name))
            .List();

我基本上想做的是能够在带有“ bob smith”示例值的文本框中搜索客户的名称,并使用上面的SQL中的LIKE表达式来搜索数据库。

如果我要错误地搜索FirstName和LastName列,请使用其他替代方法帮助我,但上述SQL查询可以为我提供所需的信息。

更新2个解决方案:

因此,我现在找到了解决此问题的两种解决方案。一种是使用Criteria
API。

我找到了另一个解决方案,这要归功于我一位乐于助人的同事的建议,他们建议使用LINQ投影和匿名类型。这是使用LINQ的解决方案:

var customers = session.Query<Customer>()
    .Select( x => new { FullName = x.FirstName + " " + x.LastName, Customer = x } )
    .Where( x => x.FullName.Contains( "Bob Smith" ) )
    .Select( x => x.Customer )
    .ToList();

阅读 189

收藏
2021-04-22

共1个答案

小编典典

NHibernate无法将表达式转换为sql语句,因为它不知道如何处理c => c.FirstName +’‘+
c.LastName。解决方案可以将其重写为如下形式:

Session.CreateCriteria<Customer>()
    .Add(Restrictions.Like(
    Projections.SqlFunction("concat",
                            NHibernateUtil.String,
                            Projections.Property("FirstName"),
                            Projections.Constant(" "),
                            Projections.Property("LastName")),
    "Bob Whiley",
    MatchMode.Anywhere))
2021-04-22