Ran*_*den 6 c# sql linq nhibernate fuzzy-search
我试图将以下SQL转换为NHibernate:
SELECT * FROM dbo.Customer
WHERE FirstName + ' ' + LastName LIKE '%' + 'bob smith' + '%'
Run Code Online (Sandbox Code Playgroud)
我试图做这样的事情,但它不起作用:
name = "%" + name + "%";
var customers = _session.QueryOver<Customer>()
.Where(NHibernate.Criterion.Restrictions.On<Customer>(c => c.FirstName + ' ' + c.LastName).IsLike(name))
.List();
Run Code Online (Sandbox Code Playgroud)
我基本上要做的是能够在文本框中搜索客户名称,其示例值为"bob smith",并使用上面SQL中的LIKE表达式搜索数据库.
如果我要错误地搜索FirstName和LastName列,请帮我一个替代方案,但上面的SQL查询可以得到我需要的东西.
更新2个解决方案:
所以我现在找到了解决这个问题的两种方法.一种是使用Criteria API.以下帖子的答案非常有用: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();
Run Code Online (Sandbox Code Playgroud)
Pet*_*ter 10
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))
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2126 次 |
| 最近记录: |