This commit is contained in:
sunkaixuan
2017-04-23 02:06:50 +08:00
parent ce9f0b2cf9
commit 11ac118768
3 changed files with 60 additions and 27 deletions

View File

@@ -38,7 +38,7 @@ namespace OrmTest.UnitTest
#region dr ot entity #region dr ot entity
db.IgnoreComumns.Add("TestId", "Student"); db.IgnoreComumns.Add("TestId", "Student");
var dr0 = db.Queryable<Student>().Select(it => new { Student = it, Name = it.Name,w=new { id=it.Id } }).ToList(); var dr0 = db.Queryable<Student>().Select(it => new { id=it.Id,w=new { x=it } }).ToList();
var dr1 = db.Queryable<Student>().Select(it => new { newid = it.Id }).ToList(); var dr1 = db.Queryable<Student>().Select(it => new { newid = it.Id }).ToList();
var dr2 = db.Queryable<Student>().Select(it => new { newid = it.Id, obj = it }).ToList(); var dr2 = db.Queryable<Student>().Select(it => new { newid = it.Id, obj = it }).ToList();
var dr3 = db.Queryable<Student>().Select(it => new ViewModelStudent2{ Student=it }).ToList(); var dr3 = db.Queryable<Student>().Select(it => new ViewModelStudent2{ Student=it }).ToList();

View File

@@ -3,6 +3,7 @@ using System.Collections.Generic;
using System.Data; using System.Data;
using System.Dynamic; using System.Dynamic;
using System.Linq; using System.Linq;
using System.Reflection;
using System.Text; using System.Text;
using System.Threading.Tasks; using System.Threading.Tasks;
using Newtonsoft.Json; using Newtonsoft.Json;
@@ -33,54 +34,86 @@ namespace SqlSugar
} }
return result; return result;
} }
/// <summary>
///DataReader to DataReaderToDictionary
/// </summary>
/// <param name="reader"></param>
/// <returns></returns>
public Dictionary<string,object> DataReaderToDictionary(IDataReader reader)
{
Dictionary<string, object> result = new Dictionary<string, object>();
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<T> DataReaderToDynamicList<T>(IDataReader reader) public List<T> DataReaderToDynamicList<T>(IDataReader reader)
{ {
var tType = typeof(T); var tType = typeof(T);
var classProperties = tType.GetProperties().Where(it => it.PropertyType.IsClass()).ToList(); var classProperties = tType.GetProperties().ToList();
var reval = new List<T>(); var reval = new List<T>();
if (reader != null && !reader.IsClosed) if (reader != null && !reader.IsClosed)
{ {
while (reader.Read()) while (reader.Read())
{ {
var expandoObject = DataReaderToExpandoObject(reader); var readerValues = DataReaderToDictionary(reader);
var dic = (IDictionary<string,object>)expandoObject; var result = new Dictionary<string, object>();
foreach (var item in classProperties) foreach (var item in classProperties)
{ {
var startsWithName = item.Name + "_"; var name = item.Name;
List<string> removeKeys = new List<string>(); var typeName = tType.Name;
foreach (var d in dic) if (item.PropertyType.IsClass())
{ {
if (d.Key.StartsWith(startsWithName)) { result.Add(name,DataReaderToDynamicList_Part(readerValues, item, reval));
removeKeys.Add(d.Key);
} }
} else
if (removeKeys.Any()) {
var keyValues = removeKeys.Select(it => new KeyValuePair<string, object>(it.Replace(startsWithName, null), dic[it])).ToList();
foreach (var key in removeKeys)
{ {
dic.Remove(key); if (readerValues.ContainsKey(name))
}
if (!item.PropertyType.IsAnonymousType())
{ {
var obj = Activator.CreateInstance(item.PropertyType, true); result.Add(name, readerValues[name]);
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);
} }
} }
} }
var stringValue = SerializeObject(expandoObject); var stringValue = SerializeObject(result);
reval.Add((T)DeserializeObject<T>(stringValue)); reval.Add((T)DeserializeObject<T>(stringValue));
} }
reader.Close(); reader.Close();
} }
return reval; return reval;
} }
private Dictionary<string,object> DataReaderToDynamicList_Part<T>(Dictionary<string, object> readerValues,PropertyInfo item, List<T> reval)
{
Dictionary<string, object> result = new Dictionary<string, object>();
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;
}
/// <summary> /// <summary>
/// Serialize Object /// Serialize Object
/// </summary> /// </summary>

View File

@@ -101,7 +101,7 @@ namespace SqlSugar
} }
else else
{ {
var asName = memberName + "_" + property.Name; var asName = "["+item.Type.Name + "." + property.Name+"]";
var columnName = property.Name; var columnName = property.Name;
if (Context.IsJoin) if (Context.IsJoin)
{ {