diff --git a/Src/Asp.Net/SqlServerTest/UnitTest/UQueryable2.cs b/Src/Asp.Net/SqlServerTest/UnitTest/UQueryable2.cs index 4f2c0780a..0cd68e19c 100644 --- a/Src/Asp.Net/SqlServerTest/UnitTest/UQueryable2.cs +++ b/Src/Asp.Net/SqlServerTest/UnitTest/UQueryable2.cs @@ -190,7 +190,28 @@ namespace OrmTest .Select(it => new Order { Name = it.Name.Replace("0", "1") }).MergeTable().Select().Where(it => it.Name.Equals("2")) .ToList(); + var list14 = Db.Queryable((o1, o2, o3) => + new JoinQueryInfos(JoinType.Inner, o1.Id == o2.Id * 2, JoinType.Inner, o1.Id == o3.Id * 4) + ) + .Select((o1, o2, o3) => new + { + id = o1.Id, + x = o1, + x2 = o2, + x3 = o3 + }).ToList(); + + var list15 = Db.Queryable((o1, o2, o3) => + new JoinQueryInfos(JoinType.Inner, o1.Id == o2.Id * 2, JoinType.Inner, o1.Id == o3.Id * 4) + ) + .Select((o1, o2, o3) => new TestModel1 + { + id = o1.Id.SelectAll(), + x = o1, + x2 = o2, + x3 = o3 + }).ToList(); } public class UnitEnumTest @@ -236,5 +257,15 @@ namespace OrmTest public int id { get; set; } public string Name { get; set; } } + public class TestModel1 + { + public int id { get; set; } + public Order x { get; set; } + public Order x2 { get; set; } + public Order x3 { get; set; } + public string name { get; set; } + } } + + } diff --git a/Src/Asp.Net/SqlSugar/Abstract/SqlBuilderProvider/QueryBuilder.cs b/Src/Asp.Net/SqlSugar/Abstract/SqlBuilderProvider/QueryBuilder.cs index 73b176c78..0a23aa8c5 100644 --- a/Src/Asp.Net/SqlSugar/Abstract/SqlBuilderProvider/QueryBuilder.cs +++ b/Src/Asp.Net/SqlSugar/Abstract/SqlBuilderProvider/QueryBuilder.cs @@ -474,7 +474,7 @@ namespace SqlSugar } public virtual bool IsComplexModel(string sql) { - return Regex.IsMatch(sql, @"AS \[\w+\.\w+\]"); + return Regex.IsMatch(sql, @"AS \[\w+\.\w+\]")|| Regex.IsMatch(sql, @"AS \[\w+\.\w+\.\w+\]"); } public string GetSqlQuerySql(string result) { diff --git a/Src/Asp.Net/SqlSugar/ExpressionsToSql/ResolveItems/BaseResolve.cs b/Src/Asp.Net/SqlSugar/ExpressionsToSql/ResolveItems/BaseResolve.cs index 5df61553a..0754ff225 100644 --- a/Src/Asp.Net/SqlSugar/ExpressionsToSql/ResolveItems/BaseResolve.cs +++ b/Src/Asp.Net/SqlSugar/ExpressionsToSql/ResolveItems/BaseResolve.cs @@ -443,6 +443,9 @@ namespace SqlSugar } else if (item.Type.IsClass()) { + var mappingKeys = GetMappingColumns(parameter.CurrentExpression); + var isSameType = mappingKeys.Keys.Count>0; + CallContextThread>.SetData("Exp_Select_Mapping_Key", mappingKeys); this.Expression = item; this.Start(); var shortName = parameter.CommonTempData; @@ -462,7 +465,11 @@ namespace SqlSugar asName = GetAsName(item, shortName, property); } } - else + else if (isSameType) + { + asName = GetAsNameAndShortName(item, shortName, property); + } + else { asName = GetAsName(item, shortName, property); } @@ -503,6 +510,61 @@ namespace SqlSugar } } + private Dictionary GetMappingColumns(Expression currentExpression) + { + Dictionary result = new Dictionary(); + if (currentExpression == null) + { + return result; + } + List types = new List(); + int i = 0; + if (currentExpression is NewExpression) + { + i = (currentExpression as NewExpression).Arguments.Count; + foreach (var item in (currentExpression as NewExpression).Arguments) + { + if (item.Type.IsClass()) + { + types.Add(item.Type); + } + } + } + else if (currentExpression is MemberInitExpression) + { + i = (currentExpression as MemberInitExpression).Bindings.Count; + foreach (var item in (currentExpression as MemberInitExpression).Bindings) + { + MemberAssignment memberAssignment = (MemberAssignment)item; + if (memberAssignment.Expression.Type.IsClass()) + { + types.Add(memberAssignment.Expression.Type); + } + } + } + if (types.Count == i) + { + return result; + } + var array = currentExpression.ToString().Split(','); + foreach (var item in array) + { + var itemArray = item.Split('=').ToArray(); + var last = itemArray.Last().Trim().Split('.').First().TrimEnd(')').TrimEnd('}'); + var first = itemArray.First().Trim(); + if (first.Contains("{")) + { + first = first.Split('{').Last().Trim(); + } + if (first.Contains("(")) + { + first = first.Split('(').Last().Trim(); + } + result.Add(first,last); + } + return result; ; + } + private string GetAsName(Expression item, object shortName, PropertyInfo property) { string asName; @@ -525,7 +587,28 @@ namespace SqlSugar return asName; } + private string GetAsNameAndShortName(Expression item, object shortName, PropertyInfo property) + { + string asName; + var propertyName = property.Name; + var dbColumnName = propertyName; + var mappingInfo = this.Context.MappingColumns.FirstOrDefault(it => it.EntityName == item.Type.Name && it.PropertyName.Equals(propertyName, StringComparison.CurrentCultureIgnoreCase)); + if (mappingInfo.HasValue()) + { + dbColumnName = mappingInfo.DbColumnName; + } + asName = this.Context.GetTranslationText(shortName+"."+item.Type.Name + "." + propertyName); + if (Context.IsJoin) + { + this.Context.Result.Append(Context.GetAsString(asName, dbColumnName, shortName.ObjToString())); + } + else + { + this.Context.Result.Append(Context.GetAsString(asName, dbColumnName)); + } + return asName; + } private static bool IsBoolValue(Expression item) { return item.Type == UtilConstants.BoolType && diff --git a/Src/Asp.Net/SqlSugar/Infrastructure/ContextMethods.cs b/Src/Asp.Net/SqlSugar/Infrastructure/ContextMethods.cs index da26e53ba..172e981ed 100644 --- a/Src/Asp.Net/SqlSugar/Infrastructure/ContextMethods.cs +++ b/Src/Asp.Net/SqlSugar/Infrastructure/ContextMethods.cs @@ -271,6 +271,7 @@ namespace SqlSugar private Dictionary DataReaderToList(IDataReader reader, Type tType, List classProperties, List reval) { var readerValues = DataReaderToDictionary(reader, tType); + var mappingKeys = CallContextThread>.GetData("Exp_Select_Mapping_Key"); var result = new Dictionary(); foreach (var item in classProperties) { @@ -296,7 +297,7 @@ namespace SqlSugar } else { - result.Add(name, DataReaderToDynamicList_Part(readerValues, item, reval)); + result.Add(name, DataReaderToDynamicList_Part(readerValues, item, reval, mappingKeys)); } } else @@ -370,7 +371,7 @@ namespace SqlSugar Regex.IsMatch(readerValues[item.Name.ToLower()].ToString(), @"^\[{.+\}]$"); } - private Dictionary DataReaderToDynamicList_Part(Dictionary readerValues, PropertyInfo item, List reval) + private Dictionary DataReaderToDynamicList_Part(Dictionary readerValues, PropertyInfo item, List reval, Dictionary mappingKeys=null) { Dictionary result = new Dictionary(); var type = item.PropertyType; @@ -407,6 +408,11 @@ namespace SqlSugar { var key = typeName + "." + name; var info = readerValues.Select(it => it.Key).FirstOrDefault(it => it.ToLower() == key.ToLower()); + if (mappingKeys.ContainsKey(item.Name)) + { + key = mappingKeys[item.Name]+"."+typeName + "." + name; + info = readerValues.Select(it => it.Key).FirstOrDefault(it => it.ToLower() == key.ToLower()); + } if (info != null) { var addItem = readerValues[info];