转 --简单解决Linq多条件组合问题
本文笔者用清晰的实例,解决了Linq多条件问题,思路十分的清晰,笔者也很细心的做了描述,希望能给你带来帮助。
最近有个项目准备功能改版,师兄吩咐:尽可能地做到万般皆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<func> ContactExpressions(this Expression exp, params Expression[] exps) {
- foreach (var e in exps) {
- if (null == e) continue;
- exp = Expression.And(exp, e);
- }
- return (Expression<func>)exp;
- }
- public static Expression<func<t1, t>> ContactExpressions<t1, t>(this Expression exp, params Expression[] exps) {
- foreach (var e in exps) {
- if (null == e) continue;
- exp = Expression.And(exp, e);
- }
- return (Expression<func<t1, t>>)exp;
- }
- public static Expression<func<t1, t2, t>> ContactExpressions<t1, t2, t>(this Expression exp, params Expression[] exps) {
- foreach (var e in exps) {
- if (null == e) continue;
- exp = Expression.And(exp, e);
- }
- return (Expression<func<t1, t2, t>>)exp;
- }
- public static Expression<func<t1, t2, t3, t>> ContactExpressions<t1, t2, t3, t>(this Expression exp,
- params Expression[] exps) {
- foreach (var e in exps) {
- if (null == e) continue;
- exp = Expression.And(exp, e);
- }
- return (Expression<func<t1, t2, t3, t>>)exp;
- }
- #endregion
有了这几个方法进行Linq多条件查询,原本的需求就可以迎刃而解了:
- Expression<func<split_opinion, < span="">bool>> expSearchType = null;
- Expression<func<split_opinion, < span="">bool>> expOpinionType = null;
- Expression<func<split_opinion, < span="">bool>> 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.ContactExpressions<split_opinion, < span="">bool>(expOpinionType, expOpinionTime),
- userID.UserTablePrefx(), true, pageIndex, pageSize);
以上就是通过Linq实例解析Linq的另类用法,然后解决Linq多条件组合问题。
原文地址:http://developer.51cto.com/art/200909/151931.htm
转 --简单解决Linq多条件组合问题的更多相关文章
- PredicateBuilder类(linq多条件组合查询)
PredicateBuilder类如下: public static class PredicateBuilder { /// <summary> /// 机关函数应用True时:单个AN ...
- 白话LINQ系列2---以代码演进方式学习LINQ必备条件
今天,我们通过一个简单的示例代码的演进过程,来学习LINQ必备条件:隐式类型局部变量:对象集合初始化器:委托:匿名函数:lambda表达式:扩展方法:匿名类型.废话不多说,我们直接进入主题. 一.实现 ...
- 学习LINQ必备条件
转自:http://www.cnblogs.com/VolcanoCloud/p/4451302.html 学习LINQ必备条件:隐式类型局部变量:对象集合初始化器:委托:匿名函数:lambda表达式 ...
- 安装程序无法打开注册表项 UNKNOWN\Components\…的简单解决办法(转)
安装程序无法打开注册表项 UNKNOWN\Components\…的简单解决办法 2018年04月16日 16:41:32 super_star_贤 阅读数:7193 在安装软件时(比如安装SQL ...
- AngularJs最简单解决跨域问题案例
AngularJs最简单解决跨域问题案例 2016-05-20 09:18 82人阅读 评论(0) 收藏 举报 分类: javascript(1) 作者:白狼 出处:http://www.mank ...
- ASP.NET MVC 解决LINQ表达式中的SqlMethods 未找到命名空间问题
右键项目属性下的引用: 添加引用: 搜索寻找——System.Data.Linq,然后添加成功,即可解决LINQ表达式中的SqlMethods 未找到命名空间问题
- C# 防止同时调用=========使用读写锁三行代码简单解决多线程并发的问题
http://www.jb51.net/article/99718.htm 本文主要介绍了C#使用读写锁三行代码简单解决多线程并发写入文件时提示"文件正在由另一进程使用,因此该进程无 ...
- solr的多条件组合查询和solr的范围查询【转】
solr的多条件组合查询和solr的范围查询 版权声明:本文为博主原创文章,供大家参考,但不要抄袭哦! 存在问题:为了减轻数据库的访问压力,往往我们将必要的数据存储到solr中,并给部分字段建立索引, ...
- jsp 多条件组合查询
web层: public String query(HttpServletRequest request, HttpServletResponse response) throws ServletEx ...
随机推荐
- js中的函数易忽略的点小节
1.Function()属性和方法 属性: prototype 2.Function对象实例属性和方法 实例属性:(例如var Function=function(x,y,z){}; myFuncti ...
- 使用pygame制作一个简单的游戏
翻译自Will McGugan的<Beginning Game Development with Python and Pygame –From Novice to Professional&g ...
- [hdu1402]A * B Problem Plus(NTT)
解题关键:快速数论变换NTT模板. 注意$ans$数组的$ans[n]$一定要注意置$0$,或者结果从$n-1$开始遍历,这里很容易出错. 代码1:ACdreamer 的板子. 为什么要reverse ...
- VMware 虚拟机 Ubuntu 系统没有IP地址 解决:UP BROADCAST MULTICAST 问题
VMware 虚拟机 ifconfig没有net_addr地址的解决方法 使用时间长的虚拟机,会莫名其妙的连接不上网 在终端中,使用ifconfig命令查看Ubuntu系统的IP地址,发现没有分配IP ...
- 会话临时表 ORA-14452
需要使用Oracle的临时表,向其中插入记录,用完后再删除.但是后来发现临时表的删除总是失败,返回错误: ORA-14452: attempt to create, alter or drop an ...
- Scrapy 框架进阶笔记
上一篇简单了解了scrapy各个模块的功能:Scrapy框架初探 -- Dapianzi卡夫卡 在这篇通过一些实例来深入理解 scrapy 的各个对象以及它们是怎么相互协作的 settings.py ...
- 大融合——LCT维护子树信息
题目 [题目描述] 小强要在 $N$ 个孤立的星球上建立起一套通信系统.这套通信系统就是连接 $N$ 个点的一个树.这个树的边是一条一条添加上去的.在某个时刻,一条边的负载就是它所在的当前能够联通的树 ...
- Hadoop集群配置免密SSH登录方法
Hadoop集群包含1个主节点和3个从节点,需要实现各节点之间的免密码登录,下面介绍具体的实现方法. 一.Hadoop集群环境 二.免密登录原理 每台主机authorized_keys文件里面包含的主 ...
- SpringBoot整合MyBatis之xml配置
现在业界比较流行的数据操作层框架 MyBatis,下面就讲解下 Springboot 如何整合 MyBatis,这里使用的是xml配置SQL而不是用注解.主要是 SQL 和业务代码应该隔离,方便和 D ...
- PHP-CGI远程任意代码执行漏洞(CVE-2012-1823)修复方案
首先介绍一下这个漏洞,其实是在apache调用php解释器解释.php文件时,会将url参数传我给php解释器,如果在url后加传命令行开关(例如-s.-d .-c或 -dauto_prepend_ ...