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

时间:2015-05-18 12:53:08

标签: c# linq nhibernate fluent-nhibernate

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

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

这可以按照预期转换为&#34; SQL之类的查询&#34;

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

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

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

  2. 由于它是一个单一的文本框,在某些情况下,人们会输入名字和姓氏(类似于&#34;史密斯,乔和#34;并且由于整体而无法找到结果字符串不存在于名字或姓氏字段中。除了将UI分成单独的字段(由于某些其他原因我无法做到)之外,是否有任何关于我如何支持查询的建议包括用户搜索字符串的以下组合

    • [首先] [上一页]
    • [上一页],[首页]
  3. 在上面的搜索代码中。

2 个答案:

答案 0 :(得分:2)

要解决上/下混合的问题,我们可以将两边转换为.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 ......

答案 1 :(得分:0)

你的第一点 -

  

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

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