动态拼接表达式——Expression

在想项目中有用到过动态拼接查询条件,现在就简单的举例说明怎么使用:

比如我们想要查询某一些会员,有多组条件。

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

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

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

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

可以看出条件组内是并且关系,但是条件组与组之间是或者关系;

这种我们通常会使用动态拼接查询条件来达到查询目的——Expression

动态拼接表达式——Expression

 

 

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

动态拼接表达式——Expression

 

 

 

以下是举例代码:

动态拼接表达式——Expression
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

 

上一篇:面向对象封装


下一篇:ISIS基础实验教程.doc