Linq实现动态查询与模糊查询

最近有个项目用Linq做的,有个复合搜索模糊查询的功能,有点麻烦,绕了好几个弯,最后是解决了,在这里分享一下我的处理过程,如果大家有更好的办法也请给我介绍一下。我用Linq还不熟,好多东西边查资料边做的。



应用场景如下图,多条件复合搜索,很常见吧(但Linq搞这个还真是麻烦):


 附件: 您所在的用户组无法下载或查看附件



阶段一:

首先是找到了李永京(YJingLee)前辈的《LINQ体验(17)——LINQ to SQL语句之动态查询》一文,利用Lambda表达式树可以进行动态查询。

写了个方法进行复合查询,动态组合条件,生成Lambda表达式。



Code

Code


搞了半天本来很兴奋的,之后才知道Lambda表达式是写不出.Contains()的,我的心瓦凉瓦凉的。



阶段二:

虽然李永京的文章没给我多少帮助,但它后面有个回复很有价值:“用微软提供的System.Linq.Dynamic方便点。”

很快找到了对应例子和Dynamic.cs,也找到了《Linq to SQL Dynamic 动态查询》,有更细致的例子,可惜Dynamic.cs也是不能使用like的,恨啊!



Code

Code


代码很容易,但没什么用:(



阶段三:

中文的实在是找不到了,在MS的官方BBS上找到了个链接,非常有用!《dynamic linq queries / dynamic where clause (part 2) 》,这个老外扩展了Dynamic.cs,写了个PredicateExtensions类,虽然不知道他是怎么想出来的,但确实有效!

这里放出核心代码,很容易看懂,简单就是美!

Code

Code


下面是我写了注释后的PredicateExtensions,我说不清楚构造函数的True和False具体是怎么起作用的,但结果就是我的注释那样,在复合查询写条件时很重要(不过目前全写AND就完成复合查询了,我还没搞多关键词OR的那种):

Code

Code


原文出处:http://www.cnblogs.com/killuakun/archive/2008/08/03/1259389.html

 感谢原创者的辛勤劳动,希望对您有所帮助,转载请注明原出处。
 您可能对 [Linq] 的这些文章也感兴趣:

Presentation: Beth Massi on Conquering XML with LINQ in VB9
打造自己的LINQ Provider(中):IQueryable和IQueryProvider
Linq to sql--使用自定义的SQL语句
在Linq to Sql中使用记录的时间戳进行检测管理并发更新时的冲突
LINQ的分组聚合技术
LINQ Framework Design Guidelines
LINQ and Pipeline Pattern
PLINQ改名为Parallel Extensions发布
LINQ体验(8)——Union All/Intersect/Top/Bottom/Paging/SqlMethods
LINQ体验(2)——C# 3.0新语言特性和改进(上篇)