本文主要是介绍Expression拼接条件,Expression.And,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.Text;
using System.Threading.Tasks;namespace WuZiFenGongSiInfomation.Common
{/// <summary>/// Lambda表达式拼接扩展类/// </summary>/// https://blogs.msdn.microsoft.com/meek/2008/05/02/linq-to-entities-combining-predicates//// http://www.albahari.com/nutshell/predicatebuilder.aspxpublic static class ExpressionUtility{/// <summary>/// Lambda表达式拼接/// </summary>/// <typeparam name="T"></typeparam>/// <param name="first"></param>/// <param name="second"></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){// 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 firstvar secondBody = ParameterRebinder.ReplaceParameters(map, second.Body);// apply composition of lambda expression bodies to parameters from the first expression return Expression.Lambda<T>(merge(first.Body, secondBody), first.Parameters);}/// <summary>/// and扩展/// </summary>/// <typeparam name="T"></typeparam>/// <param name="first"></param>/// <param name="second"></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.And);}/// <summary>/// or扩展/// </summary>/// <typeparam name="T"></typeparam>/// <param name="first"></param>/// <param name="second"></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);}}/// <summary>/// /// </summary>public class ParameterRebinder : ExpressionVisitor{private readonly Dictionary<ParameterExpression, ParameterExpression> map;/// <summary>/// /// </summary>/// <param name="map"></param>public ParameterRebinder(Dictionary<ParameterExpression, ParameterExpression> map){this.map = map ?? new Dictionary<ParameterExpression, ParameterExpression>();}/// <summary>/// /// </summary>/// <param name="map"></param>/// <param name="exp"></param>/// <returns></returns>public static Expression ReplaceParameters(Dictionary<ParameterExpression, ParameterExpression> map, Expression exp){return new ParameterRebinder(map).Visit(exp);}/// <summary>/// /// </summary>/// <param name="p"></param>/// <returns></returns>protected override Expression VisitParameter(ParameterExpression p){ParameterExpression replacement;if (map.TryGetValue(p, out replacement)){p = replacement;}return base.VisitParameter(p);}}
}
初始化Expression<Func<T, bool>>,参考代码:
Expression<Func<ArticleWhere, bool>> express= g=>true;
//拼接条件
if (!string.IsNullOrEmpty(where?.ChannelId))
{
express = express.And(x => x.ChannelId == where.ChannelId);
}
转载自:
https://blog.csdn.net/shujudeliu/article/details/84314642
这篇关于Expression拼接条件,Expression.And的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!