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

本文关键字:大小写 连接 字段 搜索 不区 nhibernate 何使用 linq | 更新日期: 2023-09-27 17:49:30

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

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

在转换为"类似SQL的查询"方面,这是预期的工作

 Select * from Person where FirstName like '%%' or LastName like '%%'

但是我有两个新的需求,我不确定nhibernate linq是否支持

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

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

    的组合
    • (第一次)(去年)
    • (去年),(第一次)

在上面的搜索代码。

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

为了解决上下混合的问题,我们可以将两边都转换成.ToLower()

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

查看这个链接了解更多关于NHibernate原生的 insensitivelikeexpressions .cs是如何工作的(对于几乎所有的方言它都是做同样的):

  • NHibernate IsInsensitiveLike将字符串视为区分大小写
第二部分,这里有一些超级简单的算法(如果有的话)
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)。在某些情况下,人们会输入大写或小写的名字所以我想做一个不区分大小写的搜索

答案已经由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中测试过