简单解决Linq多条件组合问题<转>
2009-12-08 14:42
471 查看
本文笔者用清晰的实例,解决了Linq多条件问题,思路十分的清晰,笔者也很细心的做了描述,希望能给你带来帮助。
最近有个项目准备功能改版,师兄吩咐:尽可能地做到万般皆Linq,所以很多东西都要从存储过程搬过来..昨天写评价功能的时候,碰到个Linq多条件叠加组合的问题,其需求如下:
多种查询评价的条件:
1.Linq多条件之查询类型:
收到的评价_买家给我的评价,收到的评价_卖家给我的评价,给出的评价_我给买家的评价,给出的评价_我给卖家的评价
2.Linq多条件之评价类型:
全部,好评,中评,差评
3.Linq多条件之评价查询时间:
全部,一个星期内,一个月以内,六个月以内,六个月以外
由于缓存的需要,要把Expression完成之后再传到接口那边获取相应的List<评价意见>.按照这样的看的话,
总共3个条件, 13个子条件, 排列组合之后, 会有80种的组合. - - 真的一个个组合去写的话,还真是累死人了..
左思右想,最好的方法就是把3个条件都拆开来,完成不同的Expression,到最后再把三个条件组合在一起成为一个新的Expression.网上找到的比较都只是单条件的Parameter, 查了MSDN,才知道有个Expression.And(left, right)可以完成我的需求.利用.net3.5的扩展方法写成了一个组合Expression的方法,再重载了几个多参数的表达式,如下:
有了这几个方法进行Linq多条件查询,原本的需求就可以迎刃而解了:
以上就是通过Linq实例解析Linq的另类用法,然后解决Linq多条件组合问题。
原文地址:http://developer.51cto.com/art/200909/151931.htm
最近有个项目准备功能改版,师兄吩咐:尽可能地做到万般皆Linq,所以很多东西都要从存储过程搬过来..昨天写评价功能的时候,碰到个Linq多条件叠加组合的问题,其需求如下:
多种查询评价的条件:
1.Linq多条件之查询类型:
收到的评价_买家给我的评价,收到的评价_卖家给我的评价,给出的评价_我给买家的评价,给出的评价_我给卖家的评价
public enum OpinionSearchType { 收到的评价_买家给我的评价 = 0, 收到的评价_卖家给我的评价 = 1, 给出的评价_我给买家的评价 = 2, 给出的评价_我给卖家的评价 = 3 }
2.Linq多条件之评价类型:
全部,好评,中评,差评
public enum OpinionType { 全部 = 0, 好评 = 1, 中评 = 2, 差评 = 3 }
3.Linq多条件之评价查询时间:
全部,一个星期内,一个月以内,六个月以内,六个月以外
public enum OpinionTime { 全部 = 0, 一个星期内 = 1, 一个月以内 = 2, 六个月以内 = 3, 六个月以外 = 4 }
由于缓存的需要,要把Expression完成之后再传到接口那边获取相应的List<评价意见>.按照这样的看的话,
总共3个条件, 13个子条件, 排列组合之后, 会有80种的组合. - - 真的一个个组合去写的话,还真是累死人了..
左思右想,最好的方法就是把3个条件都拆开来,完成不同的Expression,到最后再把三个条件组合在一起成为一个新的Expression.网上找到的比较都只是单条件的Parameter, 查了MSDN,才知道有个Expression.And(left, right)可以完成我的需求.利用.net3.5的扩展方法写成了一个组合Expression的方法,再重载了几个多参数的表达式,如下:
#region 表达式 public static Expression ContactExpressions(this Expression exp, params Expression[] exps) { foreach (var e in exps) { if (null == e) continue; exp = Expression.And(exp, e); } return exp; } public static Expression> ContactExpressions(this Expression exp, params Expression[] exps) { foreach (var e in exps) { if (null == e) continue; exp = Expression.And(exp, e); } return (Expression>)exp; } public static Expression> ContactExpressions(this Expression exp, params Expression[] exps) { foreach (var e in exps) { if (null == e) continue; exp = Expression.And(exp, e); } return (Expression>)exp; } public static Expression> ContactExpressions(this Expression exp, params Expression[] exps) { foreach (var e in exps) { if (null == e) continue; exp = Expression.And(exp, e); } return (Expression>)exp; } public static Expression> ContactExpressions(this Expression exp, params Expression[] exps) { foreach (var e in exps) { if (null == e) continue; exp = Expression.And(exp, e); } return (Expression>)exp; } #endregion
有了这几个方法进行Linq多条件查询,原本的需求就可以迎刃而解了:
Expressionbool>> expSearchType = null; Expressionbool>> expOpinionType = null; Expressionbool>> expOpinionTime = null; switch (searchType) { case OpinionSearchType.给出的评价_我给买家的评价: expSearchType = Y => Y.UserID == userID && !Y.IsSeller; break; case OpinionSearchType.给出的评价_我给卖家的评价: expSearchType = Y => Y.UserID == userID && Y.IsSeller; break; case OpinionSearchType.收到的评价_买家给我的评价: expSearchType = Y => Y.ToUserID == userID && !Y.IsSeller; break; case OpinionSearchType.收到的评价_卖家给我的评价: expSearchType = Y => Y.ToUserID == userID && !Y.IsSeller; break; } switch (opinType) { case OpinionType.好评: expOpinionType = Y => Y.OpinionType == 0; break; case OpinionType.中评: expOpinionType = Y => Y.OpinionType == 1; break; case OpinionType.差评: expOpinionType = Y => Y.OpinionType == 2; break; } switch (opinTime) { case OpinionTime.一个星期内: expOpinionTime = Y => (DateTime.Now - Y.OpinionTime).Days <= 7; break; case OpinionTime.一个月以内: expOpinionTime = Y => (DateTime.Now - Y.OpinionTime).Days <= 30; break; case OpinionTime.六个月以内: expOpinionTime = Y => (DateTime.Now - Y.OpinionTime).Days <= 180; break; case OpinionTime.六个月以外: expOpinionTime = Y => (DateTime.Now - Y.OpinionTime).Days > 180; break; } //GetPaged(params) 这个方法是用来获取列表并支持缓存保存的. return GetPaged(expSearchType.ContactExpressionsbool>(expOpinionType, expOpinionTime), userID.UserTablePrefx(), true, pageIndex, pageSize);
以上就是通过Linq实例解析Linq的另类用法,然后解决Linq多条件组合问题。
原文地址:http://developer.51cto.com/art/200909/151931.htm
相关文章推荐
- 从LINQ实例解析LINQ的另类用法,解决多条件组合问题
- 【C#】对异步请求处理程序IHttpAsyncHandler的理解和分享一个易用性封装 【手记】走近科学之为什么明明实现了IEnumerable<T>的类型却不能调用LINQ扩展方法 【手记】手机网页弹出层后屏蔽底层的滑动响应 【手记】ASP.NET提示“未能创建类型”处理 【Web】一个非常简单的移动web消息框 【手记】解决EXCEL跑SQL遇“查询无法运行或数据库表无法打开...”
- 解决 spring mvc 3.0 结合 hibernate3.2 使用<tx:annotation-driven>声明式事务无法提交的问题
- 关于Dictionary<k,v>绑定DataGridView的问题以及曲线解决办法
- 解决<![CDATA[xml]]>不能嵌套问题!
- Linq查询条件里有可空字段比较时报错variable '<>h__TransparentIdentifier2' of type referenced from scope '', but it is not defined
- <linux/init.h>,<linux/module.h>头文件不存在等问题的解决方法
- 数据库死锁问题 及 解决方法 <收藏>
- 安装fc17后,mysql启动错误问题解决&lt;转&gt;
- 解决 spring mvc 3.0 结合 hibernate3.2 使用<tx:annotation-driven>声明式事务无法提交的问题
- 解决用虚拟机或者公司网络下载android源码,遇到DownloadError: android.googlesource.com: <urlopen error [Errno 110] Connection timed out>的问题
- Qt4项目迁移Qt5项目一问题解决方法:#include <QtGui/QApplication> ---> No such file or directory
- cygwin安装问题“unable to get setup.ini from<....>”的解决办法
- 【微信小程序】解决 竖向<scroll-view>组件 “竖向滚动页面出现遮挡”问题
- linq查询条件参数化--解决实际问题记录
- List<> 转换为Dataset的C#代码实现 解决Nullable问题
- 基于avd7181c解决视频输入效果差的问题<三>---CVBS无色彩疑难调试手记
- Linq 多条件查询组合问题
- MyBatis 判断条件为等于的问题(<if test="type == '1'.toString()"> xxx </if>
- 问题解决[<UIViewController 0x8430220>setValue:forUndefinedKey:]this class is not key value..