如何使用 nhibernate/linq 进行不区分大小写和串联字段搜索?

How can I do case insensitive and concatenated field searches using nhibernate / linq?

我有一个使用 Fluent Nhibernate Linq / SQL 服务器的 asp.net-mvc 网站。我有一个文本框,有人可以在其中输入姓名并生成以下查询,我现在正在使用它来搜索我的个人 table:

 return Session.Query<Person>()
          .Where(r => (r.LastName.Contains(s) || r.FirstName.Contains(s)));

这在转换为 "SQL like query"

方面按预期工作
 Select * from Person where FirstName like '%%' or LastName like '%%'

但是我不确定 nhibernate linq 是否支持 2 个新要求。

  1. 在某些情况下,人们以大写或小写形式输入姓名,因此我希望能够进行不区分大小写的搜索。

  2. 因为它是一个文本框,在某些情况下人们会同时输入名字和姓氏(类似于 "Smith, Joe" 并且无法找到结果,因为整个字符串没有存在于名字或姓氏字段中。除了将 UI 分成单独的字段(由于某些其他原因我不能这样做)是否有关于如何支持查询以包含以下组合的任何建议用户的搜索字符串

    • [第一个][最后一个]
    • [最后]、[第一个]

在上面的搜索代码中。

要解决混合 upper/lower 的问题,我们可以将两边都转换为 .ToLower()

return Session.Query<Person>()
      .Where(r => (r.LastName.ToLower().Contains(s.ToLower()) 
                || r.FirstName.ToLower().Contains(s.ToLower())));

查看此 link 了解 NHibernate 本机 InsensitiveLikeExpression.cs 工作方式的更多详细信息(对于几乎所有方言 它在做同样的事情) :

  • NHibernate IsInsensitiveLike treats strings as case sensitive

第二部分,这里是一些超级简单的算法(如果是的话)

var first = searched.Split(' ')[0].ToLower();
var last = searched.Split(' ')[1].ToLower();

var emps = session.Query<Person>()
        .Where(e =>
            (e.FirstName.ToLower().StartsWith(first)
             && e.LastName.ToLower().StartsWith(last))
            ||
            (e.FirstName.ToLower().StartsWith(last)
             && e.LastName.ToLower().StartsWith(first))
        )

可以使用非常相似的解决方案 (我也是) 用于组合框搜索...其中 "Ra Ko" 也可以找到 Radim Kohler...

你的第一点-

1). In some cases people are entering the name in upper or lower case so I want to be able to do a case insensitive search.

Radim Köhler 已经给出了答案 - 将双方转换为 .ToLower()

现在谈谈你的第二点,下面的内容可能会有用。

return session.Query<Person>()
       .Where(e =>
            ((e.FirstName.ToLower() + " " + e.LastName.ToLower()).Contains(s))
            ||
            ((e.LastName.ToLower() + ", " + e.FirstName.ToLower()).Contains(s))
        )

可能有语法错误,因为我没有在 VS 中测试过。