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