在SQL Server中经常会用到模糊匹配字符串的情况,最简单的办法就是使用like关键字(like语法http://msdn.microsoft.com/en-us/library/ms179859.aspx)。但是如果我们使用的前后都加%的方式,是没办法用到索引进行快速查询的,所以很多情况下我们使用左匹配的方式。最常见的一个例子就是在搜索框中,用户输入了一部分关键字,系统可以通过用户的输入进行左匹配,找出相关的结果列出来。使用左匹配的好处是可以使用到SQL Server中对该字段建立的索引,使得查询效率很高,但是不好的SQL语句仍然会导致索引无法使用。
假设我们现在有个表YCMRSALE,其中有个字段MATNR存储了料号信息,如果我们要从这个表中查询出以AB开头的料号,如果使用NHibernate,那么我们常用的写法有:
代码语言:javascript复制//QueryOver的写法
var result = session.QueryOver<Ycmrsale>().WhereRestrictionOn(c => c.Matnr).IsLike("AB", MatchMode.Start).List<Ycmrsale>();
//Linq to NHibernate
result = session.Query<Ycmrsale>().Where(c => c.Matnr.StartsWith("AB")).ToList();
//Criteria写法
result = session.CreateCriteria<Ycmrsale>().Add(Expression.Like("Matnr", "AB", MatchMode.Start)).List<Ycmrsale>();
这几种写法本质上都是生成了如下的where条件语句:
代码语言:javascript复制where ycmrsale0_.Matnr like 'AB%'
如果使用EntityFramework,那么查询的C#代码也和NHibernate类似:
代码语言:javascript复制var result = bwEntities.YCMRSALEs.Select(s => s.MATNR).Where(s => s.StartsWith("AB"));
where条件也是一样的:
代码语言:javascript复制WHERE [Extent1].[MATNR] LIKE 'AB%'
这里只是举了最简单的情况,如果我们要查询的料号本身就包含%,比如要查询以” ”开头的料号,那么怎么保证这里的%是百分号而不是表示模糊匹配的意思呢?
使用EntityFramework就很简单,什么都不需要修改,系统会根据传入的字符串生成不同的SQL语句:
代码语言:javascript复制var result = bwEntities.YCMRSALEs.Select(s => s.MATNR).Where(s => s.StartsWith("