动态拼接表达式——Expression
2024-09-02 23:38:21
我们在项目中会遇到以下查询需求吗?
比如需要查询出满足以下条件的会员:
条件组一: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; }
} }
这个是很简单的一种用法,我这里只做了简单的讲述,希望对大家有所帮助。
最新文章
- js 防止页面后退的方法
- NopCommerce 开源商城下载配置安装
- FFTW中文参考
- 有时间测试dism
- studio_ 优化Android Studio 启动、编译和运行速度?
- 用CodeViz绘制函数调用关系图(call graph)
- vj1011:记忆化搜索
- Android5.1 - 通讯录建立群组
- 【linux之软件安装,rpm,yum】
- C#生成MD5码
- 安卓开发笔记(十六):&#39;Request(okhttp3.Request.Builder)&#39; has private access in &#39;okhttp3.Request
- WPF,强制捕获鼠标事件,鼠标移出控件外依然可以执行强制捕获的鼠标事件
- mysql同步复制异常的常见操作-传统复制方式
- 分布式架构探索 - 1. RPC框架之Java原生RMI
- Eclipse 02: 安装spring tool suite插件
- ADO.NET的五大对象【转】
- {MySQL完整性约束}一 介绍 二 not null与default 三 unique 四 primary key 五 auto_increment 六 foreign key 七 作业
- 从用户输入url到页面最后呈现 发生了些什么?
- ADO接口之_RecordsetPtr
- Android四大组件之Activity &; Fragement(续)
热门文章
- 判断状态栏是否显示以及获取状态栏高度的方法,及工具类列子【续:及OnGlobalLayoutListener的利用】
- ContentObserver 内容观察者作用及特点
- Java互联网架构师系统进阶课程 (一)【享学】
- 五、从GitHub浏览Prism示例代码的方式入门WPF下的Prism之MVVM中的EventAggregator
- Java文件和Java包结构
- Windows10公钥远程连接Linux服务器
- noip模拟45[真是啥也不会]
- jquery validate 验证插件 解决多个相同的Name 只验证第一个的方案
- mzy,struts学习(三):action中获得servlet中三域一参的三种方法
- SpEL表达式注入漏洞学习和回显poc研究