SqlHelper简单实现(通过Expression和反射)3.实体,数据传输对象(DTO)Helper类设计
EntityHelper的主要功能有:
1.通过反射获取DTO的字段,主要提供给在需要从Entity获取数据后,填充给DTO并返回的作用:
通过反射获取PropertyInfo[]对象,然后取出Name属性,填入新表。
1 /// <summary> 2 /// 获取DTO字段 3 /// </summary> 4 /// <typeparam name="T"></typeparam> 5 /// <returns></returns> 6 public static List<string> GetDTOFields<T>() 7 { 8 var fields = typeof(T).GetProperties(); 9 return fields.Select(i => i.Name).ToList(); 10 }
2.获取实体中的字段,主要提供在Select,Update,Insert,Join等中字段的获取,以及动态返回泛型TEntity时为反射构建Entity的对象时使用。
通过反射获取PropertyInfo[],当isFullName为true时,使用GetTableName<T>方法获取实体表名,并将表名和字段名用'.'连接
1 /// <summary> 2 /// 获取Entity实体中的字段 3 /// </summary> 4 /// <typeparam name="T"></typeparam> 5 /// <param name="isFullName">true:字段名前面包含表名</param> 6 /// <returns></returns> 7 public static List<string> GetFields<T>(bool isFullName) 8 { 9 var fields = typeof(T).GetProperties(); 10 var result = new List<string>(); 11 if (isFullName) 12 { 13 var tablename = EntityHelper.GetTableName<T>(); 14 result.AddRange(fields.Select(i => tablename + "." + i.Name)); 15 return result; 16 } 17 result.AddRange(fields.Select(i => i.Name)); 18 return result; 19 } 20 21 /// <summary> 22 /// 获取实体中的字段,包括表名,使用","连接 23 /// </summary> 24 /// <typeparam name="T"></typeparam> 25 /// <returns></returns> 26 public static string GetFiledString<T>() 27 { 28 var list = GetFields<T>(true).ToArray(); 29 var result = string.Join(",", list); 30 return result; 31 }
3.获取实体代表的数据表的表名,用于构建Sql时提供表名。
前文已经介绍了自定义特性[TableName],此处就是使用这个特性反射出Entity代表的表名。
1 /// <summary> 2 /// 获取实体代表的表名 3 /// </summary> 4 /// <typeparam name="T"></typeparam> 5 /// <returns></returns> 6 public static string GetTableName<T>() 7 { 8 var tablename = typeof(T).GetCustomAttributes(typeof(TableNameAttribute), true); 9 return ((TableNameAttribute)tablename[0]).TableName; 10 } 11 12 public static string GetTableName(Type entityType) 13 { 14 try 15 { 16 var tablename = entityType.GetCustomAttributes(typeof(TableNameAttribute), true); 17 return ((TableNameAttribute)tablename[0]).TableName; 18 } 19 catch 20 { 21 throw new Exception("没有配置TableName特性!"); 22 } 23 24 }
4.获取实体代表的数据表的主键
前文已经介绍了自定义特性[Primary],此处就是使用这个特性反射出Entity代表的表中的主键。
1 /// <summary> 2 /// 获取实体主键名称 3 /// </summary> 4 /// <typeparam name="T"></typeparam> 5 /// <returns></returns> 6 public static string GetPrimaryKey<T>() 7 { 8 var primary = typeof(T).GetCustomAttributes(typeof(PrimaryAttribute), true); 9 var pri = typeof(T).GetProperties(); 10 foreach (var i in pri) 11 { 12 var pris = i.GetCustomAttributes(typeof(PrimaryAttribute), true); 13 if (pris.Any()) 14 { 15 return i.Name; 16 } 17 } 18 return ""; 19 }