db.Queryable.Includes.Select.ToList

This commit is contained in:
sunkaixuan 2023-05-04 18:04:59 +08:00
parent c2120f3e44
commit cf0bdac412
3 changed files with 39 additions and 8 deletions

View File

@ -667,28 +667,53 @@ namespace SqlSugar
var manager = it; var manager = it;
var p = it.GetType().GetProperty("RootList"); var p = it.GetType().GetProperty("RootList");
var tType = it.GetType().GenericTypeArguments[0]; var tType = it.GetType().GenericTypeArguments[0];
var columns = this.Context.EntityMaintenance.GetEntityInfo(tType) var allColumns = this.Context.EntityMaintenance.GetEntityInfo(tType)
.Columns .Columns;
var columns = allColumns
.Where(it=> this.QueryBuilder.AppendNavInfo.Result.First().result.ContainsKey("SugarNav_" + it.PropertyName)) .Where(it=> this.QueryBuilder.AppendNavInfo.Result.First().result.ContainsKey("SugarNav_" + it.PropertyName))
.ToList(); .ToList();
var listType = typeof(List<>).MakeGenericType(tType); var listType = typeof(List<>).MakeGenericType(tType);
var outList=SelectNavQuery_SetList(result, it, p, tType, columns, listType); var outList=SelectNavQuery_SetList(result, it, p, tType, columns, listType);
it.GetType().GetMethod("Execute").Invoke(it, null); it.GetType().GetMethod("Execute").Invoke(it, null);
SelectNavQuery_MappingList(it,result, outList); SelectNavQuery_MappingList(it,result, outList, allColumns.Where(it=>it.Navigat!=null).ToList());
} }
} }
private void SelectNavQuery_MappingList<TResult>(object it,List<TResult> result, IList outList) private void SelectNavQuery_MappingList<TResult>(object it,List<TResult> result, IList outList,List<EntityColumnInfo> columnInfos)
{ {
for (int i = 0; i < result.Count; i++) for (int i = 0; i < result.Count; i++)
{ {
var resultItem = result[i]; var leftObject = result[i];
var outListItem = outList[i]; var rightObject = outList[i];
foreach (var item in this.QueryBuilder.AppendNavInfo.MappingNavProperties) foreach (var item in this.QueryBuilder.AppendNavInfo.MappingNavProperties)
{ {
if (item.Value.ExpressionList.Count > 0) var rightName = item.Value.Name;
var rightColumnInfo = columnInfos.FirstOrDefault(it => it.PropertyName == rightName);
var rightValue=rightColumnInfo.PropertyInfo.GetValue(rightObject);
var leftName = item.Key;
//// var rightColumn=col
// object value = item;
if (item.Value.ExpressionList.Count > 1 && rightValue != null)
{ {
//foreach (var callExp in item.Value.ExpressionList.Skip(1))
//{
MethodCallExpression meExp = (MethodCallExpression)item.Value.ExpressionList.Last();
ParameterExpression ps = ExpressionTool.GetParameters(meExp).First();
var comExp = Expression.Lambda(meExp, ps);
var obj = comExp.Compile();
// 传递参数值
var leftValue = obj.DynamicInvoke(rightObject);
leftObject.GetType().GetProperty(leftName).SetValue(leftObject, leftValue);
// // 重新构造Lambda表达式将参数替换为新的参数方法调用替换为新的方法调用
// var newExpression = Expression.Lambda<Func<X, List<int>>>(newMethodCallExpr, paramExpr);
// Expression.Call(callExp, (callExp as MethodCallExpression).Method,new )
// var propertyExpr = Expression.Property(paramExpr, rightName);
// }
}
else
{
leftObject.GetType().GetProperty(leftName).SetValue(leftObject, rightValue);
} }
} }
} }

View File

@ -58,6 +58,12 @@ namespace SqlSugar
ps.Visit(expr); ps.Visit(expr);
return ps.Parameters.Count==0; return ps.Parameters.Count==0;
} }
public static List<ParameterExpression> GetParameters(Expression expr)
{
var ps = new ParameterExpressionVisitor();
ps.Visit(expr);
return ps.Parameters;
}
public static bool IsComparisonOperatorBool(BinaryExpression binaryExp) public static bool IsComparisonOperatorBool(BinaryExpression binaryExp)
{ {
return binaryExp.NodeType.IsIn(ExpressionType.Equal, return binaryExp.NodeType.IsIn(ExpressionType.Equal,

View File

@ -2,7 +2,7 @@
<package > <package >
<metadata> <metadata>
<id>SqlSugarCore</id> <id>SqlSugarCore</id>
<version>5.1.4.68</version> <version>5.1.4.70-preview06</version>
<authors>sunkaixuan</authors> <authors>sunkaixuan</authors>
<owners>果糖大数据科技</owners> <owners>果糖大数据科技</owners>
<licenseUrl>http://www.apache.org/licenses/LICENSE-2.0.html</licenseUrl> <licenseUrl>http://www.apache.org/licenses/LICENSE-2.0.html</licenseUrl>