From 836da9ffd7159fcf46442ec50af73f39def01706 Mon Sep 17 00:00:00 2001 From: qwj <qwjzorro@163.com> Date: 星期三, 16 八月 2023 09:47:14 +0800 Subject: [PATCH] Merge branch 'master' of http://47.108.235.38:8080/r/DocumentService --- DocumentServiceAPI.Utility/UtilitySearch.cs | 90 +++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 90 insertions(+), 0 deletions(-) diff --git a/DocumentServiceAPI.Utility/UtilitySearch.cs b/DocumentServiceAPI.Utility/UtilitySearch.cs new file mode 100644 index 0000000..180b982 --- /dev/null +++ b/DocumentServiceAPI.Utility/UtilitySearch.cs @@ -0,0 +1,90 @@ +锘縰sing System.Linq.Expressions; + +namespace DocumentServiceAPI.Utility +{ + /// <summary> + /// Lambda琛ㄨ揪寮忔嫾鎺ユ墿灞曠被 + /// </summary> + public static class UtilitySearch + { + /// <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) + { + // 鏋勫缓鍙傛暟鏄犲皠锛堜粠绗簩涓弬鏁板埌绗竴涓弬鏁帮級 + var map = first.Parameters.Select((f, i) => new { f, s = second.Parameters[i] }).ToDictionary(p => p.s, p => p.f); + // 灏嗙浜屼釜lambda琛ㄨ揪寮忎腑鐨勫弬鏁版浛鎹负绗竴涓猯ambda琛ㄨ揪寮忕殑鍙傛暟 + var secondBody = ParameterRebinder.ReplaceParameters(map, second.Body); + // 灏唋ambda琛ㄨ揪寮忎綋鐨勭粍鍚堝簲鐢ㄤ簬绗竴涓〃杈惧紡涓殑鍙傛暟 + 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.AndAlso); + } + /// <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.OrElse); + } + } + /// <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); + } + + } +} -- Gitblit v1.9.1