>  기사  >  백엔드 개발  >  C# DataTable 및 다양한 구조적 엔터티 클래스 변환 방법 예

C# DataTable 및 다양한 구조적 엔터티 클래스 변환 방법 예

高洛峰
高洛峰원래의
2017-01-18 09:43:291673검색

실제 개발 과정에서, 혹은 제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 중국어 웹사이트에 주목하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.