EF And 和Or 条件拼接扩展整理

一、EF  And 和Or 条件拼接扩展


namespace Entity
{
    public static class Utility
    {
        public static Expression Compose(this Expression first, Expression second, Func merge)
        {
            // build parameter map (from parameters of second to parameters of first)
            var map = first.Parameters.Select((f, i) => new { f, s = second.Parameters[i] }).ToDictionary(p => p.s, p => p.f);
            // replace parameters in the second lambda expression with parameters from the first
            var secondBody = ParameterRebinder.ReplaceParameters(map, second.Body);
            // apply composition of lambda expression bodies to parameters from the first expression
            return Expression.Lambda(merge(first.Body, secondBody), first.Parameters);
        }
        public static Expression> And(this Expression> first, Expression> second)
        {
            return first.Compose(second, Expression.And);
        }
        public static Expression> Or(this Expression> first, Expression> second)
        {
            return first.Compose(second, Expression.Or);
        }
    }
    public class ParameterRebinder : ExpressionVisitor
    {
        private readonly Dictionary map;
        public ParameterRebinder(Dictionary map)
        {
            this.map = map ?? new Dictionary();
        }

        public static Expression ReplaceParameters(Dictionary map, Expression exp)
        {
            return new ParameterRebinder(map).Visit(exp);
        }
        protected override Expression VisitParameter(ParameterExpression p)
        {
            ParameterExpression replacement;
            if (map.TryGetValue(p, out replacement))
            {
                p = replacement;
            }
            return base.VisitParameter(p);
        }
    }
}

 

使用方式:

            //颜色
            if (string.IsNullOrEmpty(param.Color) == false)
            {
                string[] colors = param.GetColors();
                Expression> orQuery = q => false;
                foreach (var item in colors)
                {
                    query = query.Where(orQuery.Or(q=>q.ShopParamList.Any(i=>i.Color.Contains(item))));
                }
            }

 

更多:

EF Code First 使用继承类的一个问题

TransactionScope线程安全问题整理

关于EF上线文异常问题整理

你可能感兴趣的:(EntiryFramework,EF,And拼接扩展,Ef,Or,条件拼接)