From 11ac1187681628e00e4f89fd32f7398e9c37b147 Mon Sep 17 00:00:00 2001 From: sunkaixuan <610262374@qq.com> Date: Sun, 23 Apr 2017 02:06:50 +0800 Subject: [PATCH] - --- OrmTest/UnitTest/Query/SelectQuery.cs | 2 +- SqlSugar/Common/RewritableMethods.cs | 83 +++++++++++++------ .../ResolveItems/NewExpressionResolve.cs | 2 +- 3 files changed, 60 insertions(+), 27 deletions(-) diff --git a/OrmTest/UnitTest/Query/SelectQuery.cs b/OrmTest/UnitTest/Query/SelectQuery.cs index 4e3e06b95..a384cc211 100644 --- a/OrmTest/UnitTest/Query/SelectQuery.cs +++ b/OrmTest/UnitTest/Query/SelectQuery.cs @@ -38,7 +38,7 @@ namespace OrmTest.UnitTest #region dr ot entity db.IgnoreComumns.Add("TestId", "Student"); - var dr0 = db.Queryable().Select(it => new { Student = it, Name = it.Name,w=new { id=it.Id } }).ToList(); + var dr0 = db.Queryable().Select(it => new { id=it.Id,w=new { x=it } }).ToList(); var dr1 = db.Queryable().Select(it => new { newid = it.Id }).ToList(); var dr2 = db.Queryable().Select(it => new { newid = it.Id, obj = it }).ToList(); var dr3 = db.Queryable().Select(it => new ViewModelStudent2{ Student=it }).ToList(); diff --git a/SqlSugar/Common/RewritableMethods.cs b/SqlSugar/Common/RewritableMethods.cs index 8964ba4ed..09c69e1c1 100644 --- a/SqlSugar/Common/RewritableMethods.cs +++ b/SqlSugar/Common/RewritableMethods.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.Data; using System.Dynamic; using System.Linq; +using System.Reflection; using System.Text; using System.Threading.Tasks; using Newtonsoft.Json; @@ -33,54 +34,86 @@ namespace SqlSugar } return result; } + /// + ///DataReader to DataReaderToDictionary + /// + /// + /// + public Dictionary DataReaderToDictionary(IDataReader reader) + { + Dictionary result = new Dictionary(); + for (int i = 0; i < reader.FieldCount; i++) + { + try + { + result.Add(reader.GetName(i), reader.GetValue(i)); + } + catch + { + result.Add(reader.GetName(i), null); + } + } + return result; + } public List DataReaderToDynamicList(IDataReader reader) { var tType = typeof(T); - var classProperties = tType.GetProperties().Where(it => it.PropertyType.IsClass()).ToList(); + var classProperties = tType.GetProperties().ToList(); var reval = new List(); if (reader != null && !reader.IsClosed) { while (reader.Read()) { - var expandoObject = DataReaderToExpandoObject(reader); - var dic = (IDictionary)expandoObject; + var readerValues = DataReaderToDictionary(reader); + var result = new Dictionary(); foreach (var item in classProperties) { - var startsWithName = item.Name + "_"; - List removeKeys = new List(); - foreach (var d in dic) + var name = item.Name; + var typeName = tType.Name; + if (item.PropertyType.IsClass()) { - if (d.Key.StartsWith(startsWithName)) { - removeKeys.Add(d.Key); - } + result.Add(name,DataReaderToDynamicList_Part(readerValues, item, reval)); } - if (removeKeys.Any()) { - var keyValues = removeKeys.Select(it => new KeyValuePair(it.Replace(startsWithName, null), dic[it])).ToList(); - foreach (var key in removeKeys) + else + { + if (readerValues.ContainsKey(name)) { - dic.Remove(key); - } - if (!item.PropertyType.IsAnonymousType()) - { - var obj = Activator.CreateInstance(item.PropertyType, true); - var ps = obj.GetType().GetProperties(); - foreach (var keyValue in keyValues) - { - ps.Single(it => it.Name == keyValue.Key).SetValue(obj, keyValue.Value); - } - dic.Add(item.Name, obj); + result.Add(name, readerValues[name]); } } } - var stringValue = SerializeObject(expandoObject); + var stringValue = SerializeObject(result); reval.Add((T)DeserializeObject(stringValue)); } reader.Close(); } return reval; } - + private Dictionary DataReaderToDynamicList_Part(Dictionary readerValues,PropertyInfo item, List reval) + { + Dictionary result = new Dictionary(); + var type = item.PropertyType; + var classProperties = type.GetProperties().ToList(); + foreach (var prop in classProperties) + { + var name = prop.Name; + var typeName = type.Name; + if (prop.PropertyType.IsClass()) + { + result.Add(name, DataReaderToDynamicList_Part(readerValues, prop, reval)); + } + else + { + var key = typeName + "." + name; + if (readerValues.ContainsKey(key)) + { + result.Add(name, readerValues[key]); + } + } + } + return result; + } /// /// Serialize Object /// diff --git a/SqlSugar/ExpressionsToSql/ResolveItems/NewExpressionResolve.cs b/SqlSugar/ExpressionsToSql/ResolveItems/NewExpressionResolve.cs index ee2600d12..a822f9837 100644 --- a/SqlSugar/ExpressionsToSql/ResolveItems/NewExpressionResolve.cs +++ b/SqlSugar/ExpressionsToSql/ResolveItems/NewExpressionResolve.cs @@ -101,7 +101,7 @@ namespace SqlSugar } else { - var asName = memberName + "_" + property.Name; + var asName = "["+item.Type.Name + "." + property.Name+"]"; var columnName = property.Name; if (Context.IsJoin) {