This commit is contained in:
sunkaixuan
2017-04-23 02:57:59 +08:00
parent f069ecf40d
commit d2b13a4189
2 changed files with 15 additions and 11 deletions

View File

@@ -38,10 +38,10 @@ namespace OrmTest.UnitTest
#region dr ot entity #region dr ot entity
db.IgnoreComumns.Add("TestId", "Student"); db.IgnoreComumns.Add("TestId", "Student");
var dr3 = db.Queryable<Student>().Select(it => new ViewModelStudent2 { Student = it }).ToList();
var dr0 = db.Queryable<Student>().Select(it => new { id=it.Id,w=new { x=it } }).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 dr4 = db.Queryable<Student>().Select(it => new ViewModelStudent2 { Student = it, Name =it.Name }).ToList(); var dr4 = db.Queryable<Student>().Select(it => new ViewModelStudent2 { Student = it, Name =it.Name }).ToList();
#endregion #endregion

View File

@@ -7,7 +7,7 @@ using System.Reflection;
using System.Reflection.Emit; using System.Reflection.Emit;
namespace SqlSugar namespace SqlSugar
{ {
public partial class IDataReaderEntityBuilder<T> public partial class IDataReaderEntityBuilder<T>
{ {
#region fields #region fields
private static readonly MethodInfo isDBNullMethod = typeof(IDataRecord).GetMethod("IsDBNull", new Type[] { typeof(int) }); private static readonly MethodInfo isDBNullMethod = typeof(IDataRecord).GetMethod("IsDBNull", new Type[] { typeof(int) });
@@ -38,6 +38,7 @@ namespace SqlSugar
private static readonly MethodInfo getConvertEnum_Null = typeof(IDataRecordExtensions).GetMethod("GetConvertEnum_Null"); private static readonly MethodInfo getConvertEnum_Null = typeof(IDataRecordExtensions).GetMethod("GetConvertEnum_Null");
private static readonly MethodInfo getOtherNull = typeof(IDataRecordExtensions).GetMethod("GetOtherNull"); private static readonly MethodInfo getOtherNull = typeof(IDataRecordExtensions).GetMethod("GetOtherNull");
private static readonly MethodInfo getOther = typeof(IDataRecordExtensions).GetMethod("GetOther"); private static readonly MethodInfo getOther = typeof(IDataRecordExtensions).GetMethod("GetOther");
private static readonly MethodInfo getEntity= typeof(IDataRecordExtensions).GetMethod("getEntity");
private delegate T Load(IDataRecord dataRecord); private delegate T Load(IDataRecord dataRecord);
private Load handler; private Load handler;
#endregion #endregion
@@ -57,21 +58,24 @@ namespace SqlSugar
LocalBuilder result = generator.DeclareLocal(type); LocalBuilder result = generator.DeclareLocal(type);
generator.Emit(OpCodes.Newobj, type.GetConstructor(Type.EmptyTypes)); generator.Emit(OpCodes.Newobj, type.GetConstructor(Type.EmptyTypes));
generator.Emit(OpCodes.Stloc, result); generator.Emit(OpCodes.Stloc, result);
var classFieldNames = typeof(T).GetProperties().Select(it => it.Name).ToList(); var mappingColumns = context.MappingColumns.Where(it => it.EntityName == type.Name);
for (int i = 0; i < dataRecord.FieldCount; i++) for (int i = 0; i < dataRecord.FieldCount; i++)
{ {
string dbFieldName = dataRecord.GetName(i); string propName = null;
if (!classFieldNames.Any(it => it == dbFieldName) && classFieldNames.Any(it => it.Equals(dbFieldName, StringComparison.CurrentCultureIgnoreCase))) if (mappingColumns != null)
{ {
dbFieldName = classFieldNames.Single(it => it.ToLower() == dbFieldName.ToLower()); var mappingInfo = mappingColumns.SingleOrDefault(it => it.DbColumnName.Equals(dataRecord.GetName(i), StringComparison.CurrentCultureIgnoreCase));
if (mappingInfo != null)
{
propName = mappingInfo.EntityPropertyName;
}
} }
PropertyInfo propertyInfo = type.GetProperty(dbFieldName); PropertyInfo propertyInfo = type.GetProperty(type.GetProperties().Single(it=>it.Name.Equals(propName,StringComparison.CurrentCultureIgnoreCase)).Name);
Label endIfLabel = generator.DefineLabel(); Label endIfLabel = generator.DefineLabel();
if (propertyInfo != null && propertyInfo.GetSetMethod() != null) if (propertyInfo != null && propertyInfo.GetSetMethod() != null)
{ {
bool isNullable = false; bool isNullable = false;
var underType = PubMethod.GetUnderType(propertyInfo, ref isNullable); var underType = PubMethod.GetUnderType(propertyInfo, ref isNullable);
generator.Emit(OpCodes.Ldarg_0); generator.Emit(OpCodes.Ldarg_0);
generator.Emit(OpCodes.Ldc_I4, i); generator.Emit(OpCodes.Ldc_I4, i);
generator.Emit(OpCodes.Callvirt, isDBNullMethod); generator.Emit(OpCodes.Callvirt, isDBNullMethod);
@@ -79,7 +83,7 @@ namespace SqlSugar
generator.Emit(OpCodes.Ldloc, result); generator.Emit(OpCodes.Ldloc, result);
generator.Emit(OpCodes.Ldarg_0); generator.Emit(OpCodes.Ldarg_0);
generator.Emit(OpCodes.Ldc_I4, i); generator.Emit(OpCodes.Ldc_I4, i);
GeneratorCallMethod(generator, underType, isNullable, propertyInfo, dataRecord.GetDataTypeName(i), dbFieldName, context); GeneratorCallMethod(generator, underType, isNullable, propertyInfo, dataRecord.GetDataTypeName(i), propName, context);
generator.Emit(OpCodes.Callvirt, propertyInfo.GetSetMethod()); generator.Emit(OpCodes.Callvirt, propertyInfo.GetSetMethod());
generator.MarkLabel(endIfLabel); generator.MarkLabel(endIfLabel);
} }
@@ -88,7 +92,7 @@ namespace SqlSugar
generator.Emit(OpCodes.Ret); generator.Emit(OpCodes.Ret);
dynamicBuilder.handler = (Load)method.CreateDelegate(typeof(Load)); dynamicBuilder.handler = (Load)method.CreateDelegate(typeof(Load));
return dynamicBuilder; return dynamicBuilder;
} }
#endregion #endregion
#region helpers #region helpers
@@ -252,7 +256,7 @@ namespace SqlSugar
generator.Emit(OpCodes.Unbox_Any, pro.PropertyType); generator.Emit(OpCodes.Unbox_Any, pro.PropertyType);
} }
} }
} }
#endregion #endregion
} }
} }