我正在尝试将以下 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。以下帖子有一个非常有效的答案:https://stackoverflow.com/a/2937100/670028 https://stackoverflow.com/a/2937100/670028
我找到的另一个解决方案要感谢我的一位乐于助人的同事,他建议使用 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))
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)