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

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

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

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

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

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

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

生成的SQl语句:

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

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

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

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

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

以下是举例代码:

namespace HKERP.CRM.Application.CRMManagement
{
/// <summary>
/// 动态拼接表达式
/// </summary>
public class ExpressionTest : ApplicationService
{
public readonly IRepository<CrmMember, int> _memberRep;
public ExpressionTest(IRepository<CrmMember, int> memberRep)
{
_memberRep = memberRep; } /// <summary>
/// 测试
/// </summary>
[AbpAuthorize]
public async Task Test()
{ #region 封装查询条件 var param = new List<SearchMemberInputDto>
{
new SearchMemberInputDto { Sex = 1, AgeStart = 30, AgeEnd = 40 },// 30-40岁的男性
new SearchMemberInputDto { Sex = 2, AgeStart = 20, AgeEnd = 30 }, // 20-30岁的女性
new SearchMemberInputDto { Sex = 2, AgeStart = 20, AgeEnd = 30 }// 60-80岁性别未知
}; #endregion #region 动态拼接 var members = (await _memberRep.GetAllAsync()).Where(a=>a.GroupId==AbpSession.GroupId && a.IsDeleted==false); Expression<Func<CrmMember, bool>> expressions = s => false; foreach (var item in param)
{
expressions = expressions.Or(s => s.Sex == item.Sex && s.Age >=item.AgeStart && s.Age<=item.AgeEnd);
} members = members.Where(expressions); var memberList = members.ToList(); #endregion }
} /// <summary>
/// 条件
/// </summary>
public class SearchMemberInputDto
{ /// <summary>
/// 性别
///0-未知; 1-男;2-女
/// </summary>
public int Sex { get; set; } /// <summary>
/// 年龄-开始值
/// </summary>
public int AgeStart { get; set; } /// <summary>
/// 年龄-结束值
/// </summary>
public int AgeEnd { get; set; }
} }

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

最新文章

  1. js 防止页面后退的方法
  2. NopCommerce 开源商城下载配置安装
  3. FFTW中文参考
  4. 有时间测试dism
  5. studio_ 优化Android Studio 启动、编译和运行速度?
  6. 用CodeViz绘制函数调用关系图(call graph)
  7. vj1011:记忆化搜索
  8. Android5.1 - 通讯录建立群组
  9. 【linux之软件安装,rpm,yum】
  10. C#生成MD5码
  11. 安卓开发笔记(十六):&#39;Request(okhttp3.Request.Builder)&#39; has private access in &#39;okhttp3.Request
  12. WPF,强制捕获鼠标事件,鼠标移出控件外依然可以执行强制捕获的鼠标事件
  13. mysql同步复制异常的常见操作-传统复制方式
  14. 分布式架构探索 - 1. RPC框架之Java原生RMI
  15. Eclipse 02: 安装spring tool suite插件
  16. ADO.NET的五大对象【转】
  17. {MySQL完整性约束}一 介绍 二 not null与default 三 unique 四 primary key 五 auto_increment 六 foreign key 七 作业
  18. 从用户输入url到页面最后呈现 发生了些什么?
  19. ADO接口之_RecordsetPtr
  20. Android四大组件之Activity &amp; Fragement(续)

热门文章

  1. 判断状态栏是否显示以及获取状态栏高度的方法,及工具类列子【续:及OnGlobalLayoutListener的利用】
  2. ContentObserver 内容观察者作用及特点
  3. Java互联网架构师系统进阶课程 (一)【享学】
  4. 五、从GitHub浏览Prism示例代码的方式入门WPF下的Prism之MVVM中的EventAggregator
  5. Java文件和Java包结构
  6. Windows10公钥远程连接Linux服务器
  7. noip模拟45[真是啥也不会]
  8. jquery validate 验证插件 解决多个相同的Name 只验证第一个的方案
  9. mzy,struts学习(三):action中获得servlet中三域一参的三种方法
  10. SpEL表达式注入漏洞学习和回显poc研究