Update nav query

This commit is contained in:
sunkaixuan 2024-05-20 14:17:24 +08:00
parent b85e202871
commit 907ce5bf68
3 changed files with 57 additions and 1 deletions

View File

@ -19,5 +19,6 @@ namespace SqlSugar
{ {
public List<Expression> ExpressionList { get; set; } public List<Expression> ExpressionList { get; set; }
public string Name { get; set; } public string Name { get; set; }
public string ParentName { get; set; }
} }
} }

View File

@ -13,6 +13,7 @@ using System.Collections.ObjectModel;
using NetTaste; using NetTaste;
using Newtonsoft.Json.Linq; using Newtonsoft.Json.Linq;
using System.Xml.Linq; using System.Xml.Linq;
using System.Runtime.CompilerServices;
namespace SqlSugar namespace SqlSugar
@ -597,7 +598,7 @@ namespace SqlSugar
AddMappingNavProperties(dic, navInfo, entityColumns); AddMappingNavProperties(dic, navInfo, entityColumns);
} }
private static void AddMappingNavProperties(Dictionary<string, Expression> dic, AppendNavInfo navInfo, List<EntityColumnInfo> entityColumns) private void AddMappingNavProperties(Dictionary<string, Expression> dic, AppendNavInfo navInfo, List<EntityColumnInfo> entityColumns)
{ {
foreach (var item in dic) foreach (var item in dic)
{ {
@ -617,6 +618,22 @@ namespace SqlSugar
}; };
navInfo.MappingNavProperties.Add(item.Key, mappingNavColumnInfo); navInfo.MappingNavProperties.Add(item.Key, mappingNavColumnInfo);
} }
else if (ExpressionTool.IsNavMember(this.Context,value))
{
var mappingNavColumnInfo = new MappingNavColumnInfo()
{
ExpressionList = expressionTree,
Name = name
};
if (value is MemberExpression exp)
{
if (exp.Expression is MemberExpression expChild)
{
mappingNavColumnInfo.ParentName = expChild.Member.Name;
}
}
navInfo.MappingNavProperties.Add(item.Key, mappingNavColumnInfo);
}
} }
} }
@ -746,8 +763,17 @@ namespace SqlSugar
{ {
var rightName = item.Value.Name; var rightName = item.Value.Name;
var rightColumnInfo = columnInfos.FirstOrDefault(a => a.PropertyName == rightName); var rightColumnInfo = columnInfos.FirstOrDefault(a => a.PropertyName == rightName);
var anyParent = item.Value.ParentName.HasValue();
if (anyParent)
{
rightColumnInfo = columnInfos.FirstOrDefault(a => a.PropertyName == item.Value.ParentName);
}
var rightValue=rightColumnInfo.PropertyInfo.GetValue(rightObject); var rightValue=rightColumnInfo.PropertyInfo.GetValue(rightObject);
var leftName = item.Key; var leftName = item.Key;
if (anyParent)
{
rightValue = rightValue.GetType().GetProperty(item.Value.Name).GetValue(rightValue);
}
//// var rightColumn=col //// var rightColumn=col
// object value = item; // object value = item;
if (item.Value.ExpressionList.Count > 1 && rightValue != null) if (item.Value.ExpressionList.Count > 1 && rightValue != null)

View File

@ -101,6 +101,35 @@ namespace SqlSugar
} }
return isNav; return isNav;
} }
internal static bool IsNavMember(ISqlSugarClient context, Expression member)
{
var isNav = false;
if (member is MemberExpression && (member as MemberExpression)?.Type?.IsClass() == true)
{
var memberExp = (member as MemberExpression);
var name = memberExp?.Member?.Name;
var type = memberExp?.Type;
if (name != null && type != null && memberExp.Expression is ParameterExpression)
{
var rootExp = (memberExp.Expression as ParameterExpression);
var entityInfo = context?.EntityMaintenance?.GetEntityInfo(rootExp.Type);
var navColumn = entityInfo.Columns.FirstOrDefault(it => it.PropertyName == name);
isNav = navColumn?.Navigat != null;
}
else if (name != null && type != null && memberExp.Expression is MemberExpression)
{
var rootExp = (memberExp.Expression as MemberExpression);
if (rootExp.Type.IsClass()&&type.IsArray==false&&type.FullName.IsCollectionsList()==false)
{
var entityInfo = context?.EntityMaintenance?.GetEntityInfo(rootExp.Type);
var navColumn = entityInfo.Columns.FirstOrDefault(it => it.PropertyName == name);
isNav = navColumn?.Navigat != null;
}
}
}
return isNav;
}
internal static bool IsSqlParameterDbType(ExpressionContext context, Expression member) internal static bool IsSqlParameterDbType(ExpressionContext context, Expression member)
{ {
var isNav = false; var isNav = false;