【问题标题】:How can I do case insensitive and concatenated field searches using nhibernate / linq?如何使用 nhibernate / linq 进行不区分大小写和级联字段搜索?
【发布时间】:2015-05-18 12:53:07
【问题描述】:

我有一个使用 Fluent Nhibernate Linq / SQL Server 的 asp.net-mvc 网站。我有一个文本框,有人可以在其中输入姓名并生成以下查询,我现在正在使用该查询来搜索我的 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 '%%'

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

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

  2. 由于它是单个文本框,因此在某些情况下,人们会同时输入名字和姓氏(例如“Smith, Joe”,并且由于第一个或最后一个都不存在整体字符串,因此无法找到结果名称字段。除了将 UI 分解为单独的字段(由于某些其他原因我不能这样做)之外,还有什么关于我如何支持查询以包含以下用户搜索字符串组合的建议

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

在上面的搜索代码中。

【问题讨论】:

    标签: c# linq nhibernate fluent-nhibernate


    【解决方案1】:

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

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

    查看此链接了解 NHibernate 原生 InsensitiveLikeExpression.cs 是如何工作的详细信息(对于几乎所有方言它都在做同样的事情

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

    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...

    【讨论】:

      【解决方案2】:

      你的第一点-

      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 中测试过。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-02-24
        • 1970-01-01
        • 2012-12-20
        • 2010-09-12
        • 2021-06-14
        • 1970-01-01
        相关资源
        最近更新 更多