From 16b063870156db78148440971ab46c649e3e6018 Mon Sep 17 00:00:00 2001
From: 移动系统liao <liaoxujun@qq.com>
Date: 星期三, 19 三月 2025 11:44:22 +0800
Subject: [PATCH] 测试定版,

---
 cylsg/cylsg.utility/CommonHelper.cs |  171 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 168 insertions(+), 3 deletions(-)

diff --git a/cylsg/cylsg.utility/CommonHelper.cs b/cylsg/cylsg.utility/CommonHelper.cs
index 978d033..9ad189f 100644
--- a/cylsg/cylsg.utility/CommonHelper.cs
+++ b/cylsg/cylsg.utility/CommonHelper.cs
@@ -1,15 +1,22 @@
-锘縰sing System;
+锘縰sing cylsg.utility.Extend;
+using Newtonsoft.Json;
+using Newtonsoft.Json.Linq;
+using System;
 using System.Collections.Generic;
 using System.ComponentModel;
 using System.ComponentModel.DataAnnotations;
 using System.Globalization;
 using System.Linq;
+using System.Linq.Expressions;
+using System.Net.Http.Json;
 using System.Reflection;
 using System.Runtime.Loader;
 using System.Security.Cryptography;
 using System.Text;
+using System.Text.Json.Serialization;
 using System.Text.RegularExpressions;
 using System.Threading.Tasks;
+using static cylsg.utility.untilityModels;
 
 namespace cylsg.utility
 {
@@ -818,12 +825,165 @@
 
         #endregion
 
+        /// <summary>
+        /// 鏍规嵁json瀛楃绌垮鐞�
+        /// </summary>
+        /// <typeparam name="T"></typeparam>
+        /// <param name="jsonString"></param>
+        /// <param name="parameter"></param>
+        /// <returns></returns>
+        private static Expression<Func<T, bool>> CreateWhereExpressionRecursive<T>(string jsonString, ParameterExpression parameter)
+        {
+            var conditions = new List<Expression>();
+
+            JObject jsonObject = JObject.Parse(jsonString);
+
+            foreach (var property in jsonObject.Properties())
+            {
+                var propertyName = property.Name;
+                var propertyValue = property.Value.ToString();
+                if (propertyValue == "") //绌哄�间笉澶勭悊
+                    continue;
+                var propertyInfo = typeof(T).GetProperty(propertyName);
+
+                if (propertyInfo == null)
+                {
+                    propertyInfo = typeof(T).GetProperty(propertyName.FirstToCapitalize());
+                    if (propertyInfo == null)
+                        continue; // 濡傛灉灞炴�т笉瀛樺湪锛岃烦杩�
+                }
+
+                var propertyType = propertyInfo.PropertyType;
+                var TypeName = propertyType.GenericTypeArguments.Length > 0 ? propertyType.GenericTypeArguments[0].Name + "?" : propertyType.Name;
+                if (propertyType.IsClass && TypeName != "String")
+                {
+                    // 閫掑綊澶勭悊宓屽妯″瀷
+                    var nestedParameter = Expression.Parameter(propertyType, propertyName);
+                    var nestedJsonString = property.Value.ToString();
+
+                    // 浣跨敤 MakeGenericType 鍔ㄦ�佸垱寤烘硾鍨嬫柟娉�
+                    var genericMethod = typeof(CommonHelper).GetMethod("CreateWhereExpressionRecursive", BindingFlags.Static | BindingFlags.NonPublic)
+                        .MakeGenericMethod(propertyType);
+
+                    // 璋冪敤娉涘瀷鏂规硶骞惰幏鍙栬繑鍥炵殑琛ㄨ揪寮�
+                    var nestedConditions = (Expression<Func<object, bool>>)genericMethod.Invoke(null, new object[] { nestedJsonString, nestedParameter });
+
+                    var propExpr = Expression.Property(parameter, propertyName);
+                    var lambda = Expression.Lambda(nestedConditions.Body, nestedParameter);
+                    var invoke = Expression.Invoke(lambda, propExpr);
+                    conditions.Add(invoke);
+                }
+                else if (propertyType == typeof(string))
+                {
+                    var propExpr = Expression.Property(parameter, propertyName);
+                    var constant = Expression.Constant(propertyValue);
+                  
+                    var containsMethod = typeof(string).GetMethod("Contains", new[] { typeof(string) });
+                    var containsExpression = Expression.Call(propExpr, containsMethod, constant);
+                    conditions.Add(containsExpression);
+                }
+                else if (TypeName.Contains( "DateTime")) //鍏煎DateTime锛�
+                {
+                    var dateRange = propertyValue.Split('~');
+                    if (dateRange.Length == 2)
+                    {
+                        var startDate = DateTime.Parse(dateRange[0]);
+                        var endDate = DateTime.Parse(dateRange[1]);
+
+                        var propExpr = Expression.Property(parameter, propertyName);
+                        var startConstant = Expression.Constant(startDate);
+                        var endConstant = Expression.Constant(endDate);
+                        if (TypeName == "DateTime?")
+                        // 灏嗗父閲忚〃杈惧紡杞崲涓� Nullable<DateTime>
+                        {
+                            var startNullableConstant = Expression.Convert(startConstant, typeof(DateTime?));
+                            var endNullableConstant = Expression.Convert(endConstant, typeof(DateTime?));
+
+
+                            var greaterThanOrEqual = Expression.GreaterThanOrEqual(propExpr, startNullableConstant);
+                            var lessThanOrEqual = Expression.LessThanOrEqual(propExpr, endNullableConstant);
+
+
+                            var andExpression = Expression.AndAlso(greaterThanOrEqual, lessThanOrEqual);
+                            conditions.Add(andExpression);
+                        }
+                        else
+                        {
+
+                            var greaterThanOrEqual = Expression.GreaterThanOrEqual(propExpr, startConstant);
+                            var lessThanOrEqual = Expression.LessThanOrEqual(propExpr, endConstant);
+
+
+                            var andExpression = Expression.AndAlso(greaterThanOrEqual, lessThanOrEqual);
+                            conditions.Add(andExpression);
+
+                        }
+                    }
+                    else if (DateTime.TryParse(propertyValue, out var dateTime))
+                    {
+                        var propExpr = Expression.Property(parameter, propertyName);
+                        var constant = Expression.Constant(dateTime);
+                        var equalExpression = Expression.Equal(propExpr, constant);
+                        conditions.Add(equalExpression);
+                    }
+                }
+                else
+                {
+                    var propExpr = Expression.Property(parameter, propertyName);
+                    var constant = Expression.Constant(Convert.ChangeType(propertyValue, propertyType));
+                    var equalExpression = Expression.Equal(propExpr, constant);
+                    conditions.Add(equalExpression);
+                }
+            }
+
+            var body = conditions.Count > 1 ? conditions.Aggregate(Expression.AndAlso) : conditions.FirstOrDefault();
+            return Expression.Lambda<Func<T, bool>>(body ?? Expression.Constant(true), parameter);
+        }
+
+        /// <summary>
+        /// json鏍煎紡鍖栦负琛ㄨ揪寮忔爲
+        /// </summary>
+        /// <typeparam name="T"></typeparam>
+        /// <param name="jsonString"></param>
+        /// <returns></returns>
+        public static Expression<Func<T, bool>> FormatWhereExpression<T>(string jsonString)
+        {
+            var parameter = Expression.Parameter(typeof(T), "x");
+            return CreateWhereExpressionRecursive<T>(jsonString, parameter);
+        }
+
+        /// <summary>
+        /// 鏇村叿灞炴�у悕绉扮敓鎴愯〃杈惧紡鏍戯紝濡倄.id
+        /// </summary>
+        /// <typeparam name="T"></typeparam>
+        /// <param name="propertyName"></param>
+        /// <returns></returns>
+        public static Expression<Func<T, object>> FormatPropertyExpression<T>(string propertyName)
+        {
+            // 鑾峰彇鍙傛暟琛ㄨ揪寮�
+            var parameter = Expression.Parameter(typeof(T), "x");
+
+            // 鑾峰彇灞炴�ц〃杈惧紡
+            var propertyAccess = Expression.PropertyOrField(parameter, propertyName);
+            if (propertyAccess == null)
+            {
+                ///棣栧瓧姣嶈浆澶у啓
+                propertyAccess = Expression.PropertyOrField(parameter, propertyName.FirstToCapitalize());
+            }
+
+
+            // 鍒涘缓 Lambda 琛ㄨ揪寮忥紝骞跺湪杩斿洖鍊间腑杩涜绫诲瀷杞崲
+            return Expression.Lambda<Func<T, object>>(
+                Expression.Convert(propertyAccess, typeof(object)),
+                parameter);
+        }
+
+    
+   }
 
 
 
 
-
-    }
 
     /// <summary>
     /// 鏋氫妇椤瑰睘鎬�
@@ -847,4 +1007,9 @@
         [Description("鏋氫妇椤瑰睘鎬�")]
         public string? Description { get; set; }
     }
+
+
+
+
+
 }

--
Gitblit v1.9.1