在想项目中有用到过动态拼接查询条件,现在就简单的举例说明怎么使用:
比如我们想要查询某一些会员,有多组条件。
例如需要查询出满足以下条件的会员:
条件组一:30-40岁的男性会员
条件组二:20-30岁的女性会员
条件组三:.60-80岁性别未知的会员
可以看出条件组内是并且关系,但是条件组与组之间是或者关系;
这种我们通常会使用动态拼接查询条件来达到查询目的——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; } } }View Code