最近写Linq碰到一个问题,
就是如果要写一个查询系统,这个系统里面有很多TextBox可以填,
然后捞出符合各个字段的数据。

在SQL查询的时候还满方便的,用字符串连连连就可以了,
( 也就是sqlStr += "or name like '%sanc%' " )

那在Linq的话呢,就完全没有办法可以用连连连的方法QQ
后来和GOOGLE祷告后,GOOGLE告诉我目前有三种方法可以处理。

第一是出自MS的Linq Dynamic Query
Library
但听说一堆问题,就懒得去试了。
第二是自己写表达式树,也就是建立QueryBuilder
好吧,我有空会再找时间研究看看QB
第三则是由有名的C# In a Nutshell作者写的一个Library
( 其实满想读他写的书的,但是全英文....光看这篇,就懒了=
= )

总之,最后用了第三个方案,因为真的很方便,也很直觉。
要扩充或是移除,都很方便。

他给的第一个范例是这样,这个范例没用到什么技巧,
反正直接就可以用了。

1

2

3

4

5

6

7

8

9

10

11

IQueryable SearchProducts (params string[] keywords)

{

IQueryable query = dataContext.Products;

foreach (string keyword in keywords)

{

string temp = keyword;

query = query.Where (p => p.Description.Contains
(temp));

}

return query;

}

这个的功能很简单,假设你送进去,"可乐"、"畅快",
他就会把在Products的Description(描述)里面有"可乐"和"畅快"这两个关键词
的内容捞出来,也就是用and的方法。

但是,我们常常需要用到or方法,例如要查询"可乐"、"雪碧"。
那在用这种查询方法,就没办法查的到了....
( 不可能会出现一种可乐是雪碧口味的吧= =)

ok~所以作者提出了另外一种方法,也就是使用了PredicateBuilder

1

2

3

4

5

6

7

8

9

10

11

IQueryable SearchProducts (params string[] keywords)

{

var predicate = PredicateBuilder.False();

foreach (string keyword in keywords)

{

string temp = keyword;

predicate = predicate.Or (p
=> p.Description.Contains (temp));

}

return dataContext.Products.Where (predicate);

}

用Or方法,就可以用or来查询"可乐"和"雪碧"。
赞吧!!果然是神人级的。

但是看到这边,不要马上贴上去使用阿~@@~
因为最重要最重要的关键是
我们还没有PredicateBuilder这个类别阿。

这里有两个方法可以使用这个类别。
一、去作者网站下载LinqKit
二、去作者网站将PredicateBuilder的程序代码复制贴上
( 两个都够简单吧= = )

最后,要补充一下,
如果是使用Linq to Entity的话,要把程序代码的最后一行改为

1

return objectContext.Products.AsExpandable().Where
(predicate);

也就是如下程序代码。

1

2

3

4

5

6

7

8

9

10

11

IQueryable SearchProducts (params string[] keywords)

{

var predicate = PredicateBuilder.False();

foreach (string keyword in keywords)

{

string temp = keyword;

predicate = predicate.Or (p
=> p.Description.Contains (temp));

}

return objectContext.Products.AsExpandable().Where (predicate);

}

另外,如果要查名子、描述、发行公司等等
很多TextBox的话,怎么办呢?
就改成这样。

1

2

3

4

var predicate = PredicateBuilder.False();

predicate = predicate.Or(p => p.name.Contains(要查询的));

predicate = predicate.Or(p => p.Description.Contains
(要查询的));

objectContext.Products.AsExpandable().Where
(predicate);

这样扩充有没有很容易呢!?

最后,这些我都还没实验过,实验完后,我会再修改这篇文章,
将正确的讯息贴上。

[转贴]Linq之动态查询的更多相关文章

  1. System.Linq.Dynamic 动态查询

    安装 VS->工具栏->NuGet程序管理器,System.Linq.Dynamic 注意: 使用动态查询必须先调用AsQueryable()方法,因为动态扩展仅适用于实现IQueryab ...

  2. Linq 动态查询排序

    Linq的排序一般是这样写的: query.OrderBy(x => x.Tel).Skip().Take(); 实际使用中排序字段可能是通过字符类型的参数来设置的,于是想这样实现: query ...

  3. Linq动态查询简易解决之道(原创)

    因为项目需要使用Linq来查询数据,但是在多条件查询时,需要使用一大堆if(...!=string.empty)等判断条件感觉不是很优雅.网上搜索以下,大概找到了两种办法,一种是老外写的一个类,感觉用 ...

  4. Linq to sql 实现多条件的动态查询(方法一)

    /// <summary> /// Linq to sql 多字段动态查询 /// </summary> /// <returns></returns> ...

  5. Linq to Sql : 动态构造Expression进行动态查询

    原文:Linq to Sql : 动态构造Expression进行动态查询 前一篇在介绍动态查询时,提到一个问题:如何根据用户的输入条件,动态构造这个过滤条件表达式呢?Expression<Fu ...

  6. Linq to Sql:N层应用中的查询(下) : 根据条件进行动态查询

    原文:Linq to Sql:N层应用中的查询(下) : 根据条件进行动态查询 如果允许在UI层直接访问Linq to Sql的DataContext,可以省去很多问题,譬如在处理多表join的时候, ...

  7. Linq动态查询与模糊查询 ---转

    Linq动态查询与模糊查询(带源码示例) 继LINQ动态组合查询PredicateExtensions讲解 ----- 在用上面的方法时遇到了些问题 解决 LINQ to Entities 不支持 L ...

  8. c#——表达式树在LINQ动态查询

    一般如果逻辑比较简单,只是存在有的情况多一个查询条件,有的情况不需要添加该查询条件 简单方式这样操作就可以了 public IQueryable<FileImport> DynamicCh ...

  9. (转)QueryBuilder : 打造优雅的Linq To SQL动态查询

    原文地址:http://www.cnblogs.com/coolcode/archive/2009/09/28/IQueryBuilder.html 首先我们来看看日常比较典型的一种查询Form 这个 ...

随机推荐

  1. 腾讯海量数据处理平台TDW

    TDW是腾讯海量数据处理平台中最核心的模块,它有以下几个作用: 提供海量的离线计算和存储服务.TDW是腾讯内部规模最大的离线数据处理平台,公司内大多数业务的产品报表.运营分析.数据挖掘等的存储和计算都 ...

  2. JS实现各种页面的刷新

    JS实现各种页面的刷新功能 1.刷新当前页面 opener.location.replace(opener.location.href); 或者window.opener.window.locatio ...

  3. 学习笔记_Java_day12_设计模式MVC(13).JavaWeb的三层框架(14)

    MVC 1. 什么是MVC MVC模式(Model-View-Controller)是软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(Model).视图(View)和控制器(Contr ...

  4. ReactiveCocoa 入门学习 (一)

    引言 现在由于需求的不断发展,MVC这个经典的框架由于Controller的任务越来越多,显得"臃肿"了,网上又推出了新的框架,比如MVVM,ReactiveCocoa, 今天就来 ...

  5. oc文件基本读写及操作

    代码: #import <Foundation/Foundation.h> //NSString 写文件 void stringWriteToFile(){ NSString *path ...

  6. UVA 10066 The Twin Towers(LCS)

    Problem B The Twin Towers Input: standard input Output: standard output Once upon a time, in an anci ...

  7. 用crontab、crond在嵌入式系统中添加定时任务

    在嵌入式系统中,定时任务通过crond和cronttab两个系统命令来联合执行. 其中crond是定时任务的守护进程,系统开始时是没有开启的.crontab主要作用是管理用户的crontab file ...

  8. IOS 学习笔记 2015-04-09 0C-SQLite 数据存储

    1 项目导入 libsqlite3.0.dylib 框架 2 在使用数据sqlite的头文件(.h)上导入 #Impourt <sqlite3.h> 3 推荐自己本地电脑下个sqlite ...

  9. Github进行项目管理的常用命令总结

    最近项目中使用github来管理代码,将git的常用命令整理了一下,方便以后查询 查看git的本地配置git config --list 克隆到本地git clone (网页上面的那个http地址 g ...

  10. C#中的Collections命名空间

    System.Collections命名空间包含可使用的集合类和相关的接口. 该命名空间下的.NET非泛型集合类如下所示: — System.Collections.ArrayList:数组集合类,使 ...