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