用NHibernate对连续全名进行模糊搜索

我试图将以下SQL转换为NHibernate:

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

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

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

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

如果我要错误地搜索FirstName和LastName列,请帮我一个替代方案,但上面的SQL查询可以得到我需要的东西。

更新2个解决方案:

所以我现在找到了解决这个问题的两个方案。 一种是使用Criteria API。 以下post的答案非常有用: https : //stackoverflow.com/a/2937100/670028

我找到了另一个解决方案,感谢我的一位有用的同事建议使用LINQ投影和匿名类型。 这是使用LINQ的解决方案:

 var customers = session.Query() .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() .Add(Restrictions.Like( Projections.SqlFunction("concat", NHibernateUtil.String, Projections.Property("FirstName"), Projections.Constant(" "), Projections.Property("LastName")), "Bob Whiley", MatchMode.Anywhere)) 

如果您希望尽可能保持代码的强类型,我就是这样做的。 我需要在Disjunction中使用它。 希望这有助于某人!

 var disjunction = new Disjunction(); var fullNameProjection = Projections.SqlFunction( "concat", NHibernateUtil.String, Projections.Property(x => x.FirstName), Projections.Constant(" "), Projections.Property(x => x.LastName) ); var fullNameRestriction = Restrictions.Like(fullNameProjection, searchText, MatchMode.Anywhere); disjunction.Add(fullNameRestriction); 

我认为它会是这样的:

.On(c => c.IsLike(c.FirstName +”+ c.LastName))

因为您没有按照现在的方式比较正确的值。

我可以试试这个:

 query.Where(Restrictions.On(x => x.Field).IsLike(StringToSearch)) 

如果它与QueryOver或Criteria API过于复杂,您可以使用HQL语法