From 4bc0f702d70d7f101de95095cf435d3c36b91d77 Mon Sep 17 00:00:00 2001 From: sunkaixuan <610262374@qq.com> Date: Thu, 4 May 2023 22:12:56 +0800 Subject: [PATCH] db.Queryable.Includes.Select.ToList --- .../QueryableProvider/QueryableHelper.cs | 11 ++++++---- .../ResolveItems/NewExpressionResolve.cs | 1 + .../SqlSugar/Utilities/UtilMethods.cs | 22 +++++++++++++++++++ 3 files changed, 30 insertions(+), 4 deletions(-) diff --git a/Src/Asp.NetCore2/SqlSugar/Abstract/QueryableProvider/QueryableHelper.cs b/Src/Asp.NetCore2/SqlSugar/Abstract/QueryableProvider/QueryableHelper.cs index 30f6d1891..2719b2684 100644 --- a/Src/Asp.NetCore2/SqlSugar/Abstract/QueryableProvider/QueryableHelper.cs +++ b/Src/Asp.NetCore2/SqlSugar/Abstract/QueryableProvider/QueryableHelper.cs @@ -582,8 +582,10 @@ namespace SqlSugar { var value = item.Value; var expressionTree = new ExpressionTreeVisitor().GetExpressions(value); - if (expressionTree.Any()) + var isSqlMethod = ExpressionTool.GetMethodName(expressionTree.Last()).IsIn("Any", "Count"); + if (expressionTree.Any()&&isSqlMethod==false) { + var name = ExpressionTool.GetMemberName(expressionTree.First()); if (name != null && entityColumns.Any(it => it.Navigat != null && it.PropertyName == name)) { @@ -704,7 +706,7 @@ namespace SqlSugar var obj = comExp.Compile(); // 传递参数值 var leftValue = obj.DynamicInvoke(rightObject); - leftObject.GetType().GetProperty(leftName).SetValue(leftObject, leftValue); + UtilMethods.SetAnonymousObjectPropertyValue(leftObject, leftName, rightValue); // // 重新构造Lambda表达式,将参数替换为新的参数,方法调用替换为新的方法调用 // var newExpression = Expression.Lambda>>(newMethodCallExpr, paramExpr); // Expression.Call(callExp, (callExp as MethodCallExpression).Method,new ) @@ -713,12 +715,13 @@ namespace SqlSugar } else { - leftObject.GetType().GetProperty(leftName).SetValue(leftObject, rightValue); + //leftObject.GetType().GetProperty(leftName).SetValue(leftObject, rightValue); + UtilMethods.SetAnonymousObjectPropertyValue(leftObject, leftName, rightValue); } } } } - + private IList SelectNavQuery_SetList(List result, object it, PropertyInfo p, Type tType, List columns, Type listType) { var outList = Activator.CreateInstance(listType); diff --git a/Src/Asp.NetCore2/SqlSugar/ExpressionsToSql/ResolveItems/NewExpressionResolve.cs b/Src/Asp.NetCore2/SqlSugar/ExpressionsToSql/ResolveItems/NewExpressionResolve.cs index 56edb82a0..af99ef85d 100644 --- a/Src/Asp.NetCore2/SqlSugar/ExpressionsToSql/ResolveItems/NewExpressionResolve.cs +++ b/Src/Asp.NetCore2/SqlSugar/ExpressionsToSql/ResolveItems/NewExpressionResolve.cs @@ -148,6 +148,7 @@ namespace SqlSugar string memberName = expression.Members[i].Name; if (this.Context?.SugarContext?.QueryBuilder?.AppendNavInfo?.MappingNavProperties?.ContainsKey(memberName) == true) { + ++i; continue; } ++i; diff --git a/Src/Asp.NetCore2/SqlSugar/Utilities/UtilMethods.cs b/Src/Asp.NetCore2/SqlSugar/Utilities/UtilMethods.cs index 0675e138a..51277754b 100644 --- a/Src/Asp.NetCore2/SqlSugar/Utilities/UtilMethods.cs +++ b/Src/Asp.NetCore2/SqlSugar/Utilities/UtilMethods.cs @@ -17,6 +17,28 @@ namespace SqlSugar { public class UtilMethods { + public static object SetAnonymousObjectPropertyValue(object obj, string propertyName, object propertyValue) + { + if (obj.GetType().IsAnonymousType()) // 判断是否为匿名对象 + { + var objType = obj.GetType(); + var objFields = objType.GetFields(BindingFlags.Instance | BindingFlags.NonPublic); + foreach (var field in objFields) // 遍历字段列表,查找需要修改的属性 + { + if (field.Name == $"<{propertyName}>i__Field") + { + field.SetValue(obj, propertyValue); // 使用反射修改属性值 + break; + } + } + } + else + { + obj.GetType().GetProperty(propertyName).SetValue(obj, propertyValue); + } + return obj; + } + internal static bool IsNumberArray(Type type) {