zoukankan      html  css  js  c++  java
  • LinQ的动态多条件查询

    /// <summary>
        /// 重点
        /// 构造函数使用True时:单个AND有效,多个AND有效;单个OR无效,多个OR无效;混合时写在AND后的OR有效
        /// 构造函数使用False时:单个AND无效,多个AND无效;单个OR有效,多个OR有效;混合时写在OR后面的AND有效
        /// </summary>
        public static class ExpressionExtensions
        {
            /// <summary>
            ///     以特定的条件运行组合两个Expression表达式
            /// </summary>
            /// <typeparam name="T">表达式的主实体类型</typeparam>
            /// <param name="first">第一个Expression表达式</param>
            /// <param name="second">要组合的Expression表达式</param>
            /// <param name="merge">组合条件运算方式</param>
            /// <returns>组合后的表达式</returns>
            public static Expression<T> Compose<T>(this Expression<T> first, Expression<T> second,
                Func<Expression, Expression, Expression> merge)
            {
                var map =
                    first.Parameters.Select((f, i) => new { f, s = second.Parameters[i] }).ToDictionary(p => p.s, p => p.f);
                var secondBody = ParameterRebinder.ReplaceParameters(map, second.Body);
                return Expression.Lambda<T>(merge(first.Body, secondBody), first.Parameters);
            }
    
            /// <summary>
            ///     以 Expression.AndAlso 组合两个Expression表达式
            /// </summary>
            /// <typeparam name="T">表达式的主实体类型</typeparam>
            /// <param name="first">第一个Expression表达式</param>
            /// <param name="second">要组合的Expression表达式</param>
            /// <returns>组合后的表达式</returns>
            public static Expression<Func<T, bool>> And<T>(this Expression<Func<T, bool>> first,
                Expression<Func<T, bool>> second)
            {
                return first.Compose(second, Expression.AndAlso);
            }
            /// <summary>
            /// 传入条件之间为OR查询
            /// </summary>
            /// <typeparam name="T"></typeparam>
            /// <param name="source"></param>
            /// <param name="predicates"></param>
            /// <returns></returns>
            public static IQueryable<T> WhereOR<T>(this IQueryable<T> source, params Expression<Func<T, bool>>[] predicates)
            {
                if (source == null) throw new ArgumentNullException("source");
                if (predicates == null) throw new ArgumentNullException("predicates");
                if (predicates.Length == 0) return source.Where(x => false); // no matches!
                if (predicates.Length == 1) return source.Where(predicates[0]); // simple
    
                var param = Expression.Parameter(typeof(T), "x");
                Expression body = Expression.Invoke(predicates[0], param);
                for (int i = 1; i < predicates.Length; i++)
                {
                    body = Expression.OrElse(body, Expression.Invoke(predicates[i], param));
                }
                var lambda = Expression.Lambda<Func<T, bool>>(body, param);
                return source.Where(lambda);
            }
            /// <summary>
            ///     以 Expression.OrElse 组合两个Expression表达式
            /// </summary>
            /// <typeparam name="T">表达式的主实体类型</typeparam>
            /// <param name="first">第一个Expression表达式</param>
            /// <param name="second">要组合的Expression表达式</param>
            /// <returns>组合后的表达式</returns>
            public static Expression<Func<T, bool>> Or<T>(this Expression<Func<T, bool>> first,
                Expression<Func<T, bool>> second)
            {
                return first.Compose(second, Expression.Or);
            }
            public static Expression<Func<T, bool>> OrElse<T>(this Expression<Func<T, bool>> first,
                Expression<Func<T, bool>> second)
            {
                return first.Compose(second, Expression.OrElse);
            }
    
            private class ParameterRebinder : ExpressionVisitor
            {
                private readonly Dictionary<ParameterExpression, ParameterExpression> _map;
    
                private ParameterRebinder(Dictionary<ParameterExpression, ParameterExpression> map)
                {
                    _map = map ?? new Dictionary<ParameterExpression, ParameterExpression>();
                }
    
                public static Expression ReplaceParameters(Dictionary<ParameterExpression, ParameterExpression> map,
                    Expression exp)
                {
                    return new ParameterRebinder(map).Visit(exp);
                }
    
                protected override Expression VisitParameter(ParameterExpression node)
                {
                    ParameterExpression replacement;
                    if (_map.TryGetValue(node, out replacement))
                        node = replacement;
                    return base.VisitParameter(node);
                }
            }
        }

    使用

    actionPlanList.Add(actionPlanModel); 
     Expression<Func<ActionPlanModel, bool>> ex = t => false;
    if (projectNames.Count>0)
                {
                    
                    foreach (var projectName in projectNames)
                    {
                        ex = ex.Or(s => s.ProjectName==projectName);
                    }
                    
                }
                if (coachAccountNames.Count>0)
                {
    
                    foreach (var coachAccountName in coachAccountNames)
                    {
                        ex = ex.Or(s => s.CoachName==coachAccountName);
                    }
                }
                if (DealerNameCNs.Count>0)
                {
                    foreach (var DealerNameCN in DealerNameCNs)
                    {
                        ex = ex.Or(s => s.DealerNameCN==DealerNameCN);
                    }
                   
                }
              //And在后面
                if (!string.IsNullOrEmpty(projectYear))
                {
                    ex = ex.And(s => s.ProjectYear.Equals(projectYear));
                }
                 actionPlanListNew = actionPlanList.Where(ex.Compile()).ToList();
  • 相关阅读:
    使用Double计算问题
    IDEA使用破解包后卸载重装或更新后无法启动问题
    GIT找出update-index --assume-unchanged关闭跟踪的文件
    GIT实现本地配置文件修改后不提交远程仓库
    git提交文件操作
    java.time.LocalDate的优点
    Eclipse中导入Maven项目pom.xml报"Unknown"错误的解决
    jsdelivr访问github资源
    java的反射机制及意义
    Oracle创建用户、表空间、视图并赋权限
  • 原文地址:https://www.cnblogs.com/914556495wxkj/p/14136523.html
Copyright © 2011-2022 走看看