[转贴]Linq之动态查询
最近写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 } 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 } return dataContext.Products.Where (predicate); } |
用Or方法,就可以用or来查询"可乐"和"雪碧"。
赞吧!!果然是神人级的。
但是看到这边,不要马上贴上去使用阿~@@~
因为最重要最重要的关键是
我们还没有PredicateBuilder这个类别阿。
这里有两个方法可以使用这个类别。
一、去作者网站下载LinqKit
二、去作者网站将PredicateBuilder的程序代码复制贴上
( 两个都够简单吧= = )
最后,要补充一下,
如果是使用Linq to Entity的话,要把程序代码的最后一行改为
|
1 |
return objectContext.Products.AsExpandable().Where |
也就是如下程序代码。
|
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 } 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 |
这样扩充有没有很容易呢!?
最后,这些我都还没实验过,实验完后,我会再修改这篇文章,
将正确的讯息贴上。
[转贴]Linq之动态查询的更多相关文章
- System.Linq.Dynamic 动态查询
安装 VS->工具栏->NuGet程序管理器,System.Linq.Dynamic 注意: 使用动态查询必须先调用AsQueryable()方法,因为动态扩展仅适用于实现IQueryab ...
- Linq 动态查询排序
Linq的排序一般是这样写的: query.OrderBy(x => x.Tel).Skip().Take(); 实际使用中排序字段可能是通过字符类型的参数来设置的,于是想这样实现: query ...
- Linq动态查询简易解决之道(原创)
因为项目需要使用Linq来查询数据,但是在多条件查询时,需要使用一大堆if(...!=string.empty)等判断条件感觉不是很优雅.网上搜索以下,大概找到了两种办法,一种是老外写的一个类,感觉用 ...
- Linq to sql 实现多条件的动态查询(方法一)
/// <summary> /// Linq to sql 多字段动态查询 /// </summary> /// <returns></returns> ...
- Linq to Sql : 动态构造Expression进行动态查询
原文:Linq to Sql : 动态构造Expression进行动态查询 前一篇在介绍动态查询时,提到一个问题:如何根据用户的输入条件,动态构造这个过滤条件表达式呢?Expression<Fu ...
- Linq to Sql:N层应用中的查询(下) : 根据条件进行动态查询
原文:Linq to Sql:N层应用中的查询(下) : 根据条件进行动态查询 如果允许在UI层直接访问Linq to Sql的DataContext,可以省去很多问题,譬如在处理多表join的时候, ...
- Linq动态查询与模糊查询 ---转
Linq动态查询与模糊查询(带源码示例) 继LINQ动态组合查询PredicateExtensions讲解 ----- 在用上面的方法时遇到了些问题 解决 LINQ to Entities 不支持 L ...
- c#——表达式树在LINQ动态查询
一般如果逻辑比较简单,只是存在有的情况多一个查询条件,有的情况不需要添加该查询条件 简单方式这样操作就可以了 public IQueryable<FileImport> DynamicCh ...
- (转)QueryBuilder : 打造优雅的Linq To SQL动态查询
原文地址:http://www.cnblogs.com/coolcode/archive/2009/09/28/IQueryBuilder.html 首先我们来看看日常比较典型的一种查询Form 这个 ...
随机推荐
- I2C Verilog的实现(二)
1. 起始结束信号的判断 //--------------------------------------------- //start,stop condition judgement //---- ...
- .Net Framework 各个版本新特性总结 (一)
.Net Framework 4.5 新特性 最近面试时又看到有问.Net Framework 新特性的问题,一时被问到了.平时也是拿起来就用,新版本出来了,新特性也就是瞄一眼,也没去仔细查看.这次干 ...
- magento中的一些技巧
1.加载某个attribute: $attributeCode=Mage::getModel('catalog/resource_eav_attribute') ...
- css3绘制中国结
<!doctype html> <html> <head> <title></title> <meta charset='utf-8' ...
- Oracel 数据库函数
-- Oracle 函数 学习 -- 数值函数 ,(四舍五入, 取整,常用计算,三角) -- 1.四舍五入 round(n[,m]) ,省略m :表示 0 ;m>0 ;小数点后m位 ;m< ...
- 浅谈C#随机数发生器
我们在做能自动生成试卷的考试系统时,常常需要随机生成一组不重复的题目,在.net Framework中提供了一个专门用来产生随机数的类System.Random. 对于随机数,大家都知道,计算机不 可 ...
- 20160406javaweb 之JDBC简单案例
前几天写的user注册登录注销案例,没有用到数据库,现在做出改动,使用数据库存储信息: 一.首先我们需要建立一个数据库: 如下图: 创建数据库的代码如下: -- 导出 database02 的数据库结 ...
- TransactionScope事务
一个错误的理解就是Complete()方法是提交事务的,这是错误的,事实上,它的作用的表示本事务完成,它一般放在try{}的结尾处,不用判断前台操作是否成功,如果不成功,它会自己回滚. #region ...
- jquery - ul li click 无响应
搞了很久, 发现对应jquery来说, 动态产生的ul li(其实不只是这个, 还有 table td等), 直接使用 $("#ul_div>li").click(funct ...
- 经典SQL语句大全(绝对的经典)
”,start为起始位置,length为字符串长度,实际应用中以len(expression)取得其长度3,right(char_expr,int_expr) 返回字符串右边第int_expr个字符, ...