c# - 使用 NHibernate 对连接的全名进行模糊搜索

标签 c# sql linq nhibernate fuzzy-search

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

我找到的另一个解决方案要感谢一位乐于助人的同事,他建议使用 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))

关于c# - 使用 NHibernate 对连接的全名进行模糊搜索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6709463/

相关文章:

c# - 在游戏中制作大量咒语时遇到困难

c# - 使用 HTMLNode 的 foreach 循环中的 NullReferenceException 错误

sql - Oracle 查找具有特定列的所有表

c# - 使用 LINQ 基于三列搜索全名

c# - Razor Pages 应用程序中有没有办法更改到某个区域的默认起始路线?

c# - 您能否将装饰器的位置附加到装饰元素左上角以外的任何位置?

sql - 如何获取 varchar(MAX) 字符串类型的 XML 标记的值?

sql - 使用变量和索引的 T-SQL LIKE

c# - 如何构建 LINQ to Entities 查询以直接加载子对象,而不是调用 Reference 属性或 Load()

c# - LINQ 字典非单值