실제 개발 과정에서, 혹은 제3자 회사에서 제공하는 데이터 테이블 구조가 우리 시스템의 엔터티 클래스 필드와 일치하지 않는 경우, 어떻게 처리해야 할까요? 어떤 사람들은 변환 중에 엔터티 개체를 생성하고 테이블의 데이터를 한 행씩 탐색하여 엔터티 개체를 인스턴스화하는 것만으로는 충분하지 않다고 말할 수 있습니다. 예, 이 방법은 가능하지만 이 방법은 매우 비효율적입니다. 수억 개의 데이터가 발생하면 수억 개의 개체를 인스턴스화해야 하며 이는 효율성을 보여줍니다.
먼저 내 엔터티 클래스
/// <summary> /// 具体的实体类,和数据表中不同 /// </summary> public class Person { [DataField("user_name")]//表示数据库表里面的字段 public string UserName { set; get; }//表示需要转换成的字段 [DataField("pass_word")] public string PassWord { set; get; } }
를 살펴보세요. 코드에 주석이 있습니다. 다음은 변환 클래스
[AttributeUsage(AttributeTargets.Property)] public sealed class DataFieldAttribute : Attribute { /// <summary> /// 表对应的字段名 /// </summary> public string ColumnName { set; get; } public DataFieldAttribute(string columnName) { ColumnName = columnName; } } public static class DataConvert<T> where T : new() { /// <summary> /// 将DataRow行转换成Entity /// </summary> /// <param name="dr"></param> /// <returns></returns> public static T ToEntity(DataRow dr) { T entity = new T(); Type info = typeof(T); var members = info.GetMembers(); foreach (var mi in members) { if (mi.MemberType == MemberTypes.Property) { //读取属性上的DataField特性 object[] attributes = mi.GetCustomAttributes(typeof(DataFieldAttribute), true); foreach (var attr in attributes) { var dataFieldAttr = attr as DataFieldAttribute; if (dataFieldAttr != null) { var propInfo = info.GetProperty(mi.Name); if (dr.Table.Columns.Contains(dataFieldAttr.ColumnName)) { //根据ColumnName,将dr中的相对字段赋值给Entity属性 propInfo.SetValue(entity, Convert.ChangeType(dr[dataFieldAttr.ColumnName], propInfo.PropertyType), null); } } } } } return entity; } /// <summary> /// 将DataTable转换成Entity列表 /// </summary> /// <param name="dt"></param> /// <returns></returns> public static List<T> ToList(DataTable dt) { List<T> list = new List<T>(dt.Rows.Count); foreach (DataRow dr in dt.Rows) { list.Add(ToEntity(dr)); } return list; } }
호출 코드입니다.
DataTable dt = new DataTable(); dt.Columns.Add("user_name"); dt.Columns.Add("pass_word");//这是表中的字段,现在需要将它们转换为具体的实体类实例 dt.Rows.Add("kingtiger","1"); dt.Rows.Add("wangbiao", "2"); var users = DataConvert<Person>.ToList(dt); foreach (var user in users) { Response.Write(user.UserName + "," + user.PassWord); } for (int i = 0; i < dt.Rows.Count; i++) { Person p = DataConvert<Person>.ToEntity(dt.Rows[i]); Response.Write(p.UserName + "," + p.PassWord); }
더 보기 c# DataTable 및 다양한 구조적 엔터티 클래스를 변환하는 방법 예제와 관련된 기사를 보려면 PHP 중국어 웹사이트에 주목하세요!