我们在项目中会遇到以下查询需求吗?

比如需要查询出满足以下条件的会员:

条件组一:30-40岁的男性会员

条件组二:20-30岁的女性会员

条件组三:60-80岁性别未知的会员

条件组内是并且关系,但是条件组与组之间是或者关系。

很多程序员脑袋可能会直接蹦出用where拼接条件组的想法,就如同下面图片所展示的方法 :

生成的SQl语句:

根据生成的sql语句我们会发现直接使用Where拼接出来的sql语句是并且的关系,

原本我们想要的结果是组与组之间是或者的关系,但是现在变成了并且的关系,很显然不满足我们的查询需求。

想要达到我们的查询需求,我们得使用动态拼接条件的方法,通常我会使用Expression

最终我们生成的sql语句为:

从查询语句可以看出达到了我们的查询需求,组与组之间是或者的关系。

以下是举例代码:

  1. namespace HKERP.CRM.Application.CRMManagement
  2. {
  3. /// <summary>
  4. /// 动态拼接表达式
  5. /// </summary>
  6. public class ExpressionTest : ApplicationService
  7. {
  8. public readonly IRepository<CrmMember, int> _memberRep;
  9. public ExpressionTest(IRepository<CrmMember, int> memberRep)
  10. {
  11. _memberRep = memberRep;
  12.  
  13. }
  14.  
  15. /// <summary>
  16. /// 测试
  17. /// </summary>
  18. [AbpAuthorize]
  19. public async Task Test()
  20. {
  21.  
  22. #region 封装查询条件
  23.  
  24. var param = new List<SearchMemberInputDto>
  25. {
  26. new SearchMemberInputDto { Sex = 1, AgeStart = 30, AgeEnd = 40 },// 30-40岁的男性
  27. new SearchMemberInputDto { Sex = 2, AgeStart = 20, AgeEnd = 30 }, // 20-30岁的女性
  28. new SearchMemberInputDto { Sex = 2, AgeStart = 20, AgeEnd = 30 }// 60-80岁性别未知
  29. };
  30.  
  31. #endregion
  32.  
  33. #region 动态拼接
  34.  
  35. var members = (await _memberRep.GetAllAsync()).Where(a=>a.GroupId==AbpSession.GroupId && a.IsDeleted==false);
  36.  
  37. Expression<Func<CrmMember, bool>> expressions = s => false;
  38.  
  39. foreach (var item in param)
  40. {
  41. expressions = expressions.Or(s => s.Sex == item.Sex && s.Age >=item.AgeStart && s.Age<=item.AgeEnd);
  42. }
  43.  
  44. members = members.Where(expressions);
  45.  
  46. var memberList = members.ToList();
  47.  
  48. #endregion
  49.  
  50. }
  51. }
  52.  
  53. /// <summary>
  54. /// 条件
  55. /// </summary>
  56. public class SearchMemberInputDto
  57. {
  58.  
  59. /// <summary>
  60. /// 性别
  61. ///0-未知; 1-男;2-女
  62. /// </summary>
  63. public int Sex { get; set; }
  64.  
  65. /// <summary>
  66. /// 年龄-开始值
  67. /// </summary>
  68. public int AgeStart { get; set; }
  69.  
  70. /// <summary>
  71. /// 年龄-结束值
  72. /// </summary>
  73. public int AgeEnd { get; set; }
  74. }
  75.  
  76. }

这个是很简单的一种用法,我这里只做了简单的讲述,希望对大家有所帮助。

动态拼接表达式——Expression的更多相关文章

  1. .NetCore 使用 Linq 动态拼接Expression表达式条件来实现 对EF、EF Core 扩展查询排序操作

    相信在使用EF的时候对查询条件或者排序上的处理令人心烦,下面我们就来动态拼接表达式解决这一问题 当我们在查询中使用Where的时候可以看到如下参数 下面我们就来扩展 Expression<Fun ...

  2. Expression表达式目录树动态拼接 反射获取泛型方法

    class TestOne { public String[] arr = { "1", "2", "3" }; public class ...

  3. 分享动态拼接Expression表达式组件及原理

    前言 LINQ大家都知道,用起来也还不错,但有一个问题,当你用Linq进行搜索的时候,你是这样写的 var query = from user in db.Set<User>()      ...

  4. Lambda表达式动态拼接(备忘)

    EntityFramework动态组合Lambda表达式作为数据筛选条件,代替拼接SQL语句 分类: C# Lambda/Linq Entity Framework 2013-05-24 06:58 ...

  5. 表达式树动态拼接lambda

    动态拼接lambda表达式树   前言 最近在优化同事写的代码(我们的框架用的是dapperLambda),其中有一个这样很普通的场景——界面上提供了一些查询条件框供用户来进行过滤数据.由于dappe ...

  6. 动态拼接lambda表达式树

    前言 最近在优化同事写的代码(我们的框架用的是dapperLambda),其中有一个这样很普通的场景——界面上提供了一些查询条件框供用户来进行过滤数据.由于dapperLambda按条件查询时是传入表 ...

  7. 泛型方法动态生成表达式树 Expression

    public string GetGridJSON(TraderInfo model) { IQueryable<TraderInfo> Temp = db.TraderInfo; if ...

  8. Lambda 表达式动态拼接.

    背景: 项目使用EF 查询时需要手动判断条件写.觉得太麻烦就Google 如何动态生成Linq.最后找到了 System.Linq.Dynamic.Core. 这个东西. Scott Guthrie ...

  9. Asp.net Core C#进行筛选、过滤、使用PredicateBuilder进行动态拼接lamdba表达式树并用作条件精准查询,模糊查询

    在asp.net core.asp.net 中做where条件过滤筛选的时候写的长而繁琐不利于维护,用PredicateBuilder进行筛选.过滤.LInq配合Ef.core进行动态拼接lamdba ...

随机推荐

  1. 攻防世界pwn高手区——pwn1

    攻防世界 -- pwn1 攻防世界的一道pwn题,也有一段时间没有做pwn了,找了一道栈题热身,发现还是有些生疏了. 题目流程 拖入IDA中,题目流程如图所示,当v0为1时,存在栈溢出漏洞.在gdb中 ...

  2. Git8.3k星,十万字Android主流开源框架源码解析,必须盘

    为什么读源码 很多人一定和我一样的感受:源码在工作中有用吗?用处大吗?很长一段时间内我也有这样的疑问,认为哪些有事没事扯源码的人就是在装,只是为了提高他们的逼格而已. 那为什么我还要读源码呢?一刚开始 ...

  3. Windows根据端口号查找对应的进程和服务

    需求 1,我们在Win10安装一些Web服务时,会发现默认端口被占用,比如443端口被占用,808端口被占用,那么如何找出占用这些默认端口的进程和对应的服务呢? 2,系统安装完成后,会有一些应用对外开 ...

  4. XSS之防御与绕过

    很久之前的随笔讲过XSS的编码绕过的一些内容 本次侧重整理一下常见的防御思路,顺便补充一些针对性的绕过思路以及关于XSS个人想到的一些有趣的事情 开篇之前,先看一下XSS介绍(包括mXSS.uXSS. ...

  5. ad 差分布线 等长布线

    差分要素: 1.原理图差分对名字后缀必须是 _n _p 2.规则改动 定义差分线宽和间距

  6. 利用VAR模型科学管理仓位,提升策略效率

    更多精彩内容,欢迎关注公众号:数量技术宅,也可添加技术宅个人微信号:sljsz01,与我交流. 期货行情瞬息万变,保证金体系决定了期货交易的杠杆属性.保证金放多了,资金利用率低,放少了,可能在大幅度的 ...

  7. AECC2018同时中英文切换多开使用,加倍提高你的工作效率

    最近相信不少人已经更新了AECC2018,升级之后第一件重要的事当然是中英文的切换了,要不然工作中很麻烦.对于一直习惯用中文的人来说,在用模板过程中会出现各种表达式报错极其不方便,而对于习惯英文操作朋 ...

  8. WPF 饼状图,柱形图,折线图 (2 折线图)

    折线图在柱形图的基础上,做了一些修改.大概效果和用法如下. X轴和Y轴的刻度,使用用了Path的Figures属性,绘制多条Figure+LineSegment完成. 同时,由于折线图很可能会画多条线 ...

  9. 异步编程之EAP

    一.概述 前面我们了解到了APM编程模式,但APM不支持对异步操作的取消和没有提供对进度报告的功能. 对于界面程序来说,进度报告和取消操作的支持也是必不可少的,为了支持这些功能,微软在.NET 2.0 ...

  10. 异步编程之APM

    一.APM概述 APM即异步编程模型的简写(Asynchronous Programming Model),我们平时经常会遇到类似BeginXXX和EndXXX的方法,我们在使用这些方法的时候,其实就 ...