我有一个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是否支持
在某些情况下,人们以大写或小写输入名称,因此我希望能够进行不区分大小写的搜索。
由于它是一个单一的文本框,在某些情况下,人们键入名字和姓氏(如"Smith, Joe"),由于在名字或姓氏字段中不存在整体字符串,因此无法找到结果。除了将UI分解为单独的字段(由于其他一些原因我不能这样做)之外,是否有任何建议关于我如何支持查询以包含以下用户搜索字符串
的组合- (第一次)(去年)
- (去年),(第一次)
在上面的搜索代码。
为了解决上下混合的问题,我们可以将两边都转换成.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中测试过