我正在尝试将以下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();
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))