����λ�ã���ҳ > �����̳� > �̳� > ʵ�ֶ��󼯺���DataTable���໥ת��

ʵ�ֶ��󼯺���DataTable���໥ת��

��Դ������������|��ʱ�䣺2024-12-02 10:07:41 |���Ķ���181��|�� ��ǩ�� a T ���� El C ��Դ excel EA �� |����������

������󼯺���DataTable�໥ת������������ת���󼯺���У�����͡�������Ӧ��������ṹ�帳ֵ���⣻���󼯺�ת����һά����ת��������ת�õķ�����ʾ�����룬����Դ�����ϴ���

����ϻأ����ǽ����������ʵ�ֶ��󼯺���DataTable���໥ת����

ʵÏÖ¶ÔÏ󼯺ÏÓëDataTableµÄÏ໥ת»»

01���ѱ���ת��Ϊ���󼯺�

�÷����ǽ��������������Ϊ������������������������תΪ��Ķ��󡣴Ӷ�ʵ�ֱ���ת��Ϊ���󼯺ϡ�ͬʱ����Լ������������������DescriptionAttribute���ԣ�������ֵ�ͱ�������һһ��Ӧ�����û������������ȡ�������ƺ�����һһ��Ӧ��

ͬʱ������ҪԼ����ֻ��Ϊ�ṹ����࣬��������ö�١��������͡��Լ��������͡�ί�С��ӿڵȡ�

�������У��ɹ������ǻ���ҪУ������Ƿ���ת��Ϊ���󣬼��жϱ�������������������ƻ���Description����ֵ�Ƿ����һ�£����û��һ��������������������ܶ�Ӧ�ϣ��򱨱��������޷�ӳ�����������ԣ��޷����ת���쳣��

����ЩУ��ɹ��󣬿�ʼѭ�����������м�¼����ÿһ�ж�ת��Ϊһ������

���ǿ���ͨ�����䶯̬ʵ����������ͨ������Զ�������Զ�̬��ֵ����Ϊ���ǵĶ���֧����Ҳ֧�ֽṹ�壬���������ͻ�����һ���������⣬������property.SetValue������û�а취���ṹ�嶯̬��ֵ��

������Ϊ�ṹ����ֵ���ͣ���property.SetValue�����IJ�������object�������������漰��װ����䣬���SetValue��������װ���Ժ�Ķ��󣬶������ܸı�ԭ����

������취�����Ȱѽṹ�帳ֵ��object������Ȼ���object��������SetValue����ֵ������ٰ�object����תΪ�ṹ�塣

��������һ�𿴿�����ʵ�ִ��룺

//�ѱ���ת��Ϊ���󼯺�
//�������DescriptionAttribute��������ֵ��Ϊ�����������
//�����������������������
public static IEnumerable ToModels(DataTable dataTable)
{
    //T�����ǽṹ����࣬���Ҳ����Ǽ�������
    AssertTypeValid();
    if (0 == dataTable.Rows.Count)
    {
        return [];
    }
    //��ȡT���п�д������
    var properties = typeof(T).GetProperties().Where(u => u.CanWrite);
    //У������Ƿ���ת��Ϊ����
    var isCanParse = IsCanMapDataTableToModel(dataTable, properties);
    if (!isCanParse)
    {
        throw new NotSupportedException("The column name of the table cannot be mapped to an object property, and the conversion cannot be completed.");
    }
    var models = new List();
    foreach (DataRow dr in dataTable.Rows)
    {
        //ͨ������ʵ����T
        var model = Activator.CreateInstance();
        //��������ӳ�䵽������
        if (typeof(T).IsClass)
        {
            //����T������
            MapRowToModel(dr, model, properties);
        }
        else
        {
            //����TΪ�ṹ������
            object boxed = model!;
            MapRowToModel(dr, boxed, properties);
            model = (T)boxed;
        }
        models.Add(model);
    }
    return models;
}
//У������Ƿ���ת��Ϊ����
private static bool IsCanMapDataTableToModel(DataTable dataTable, IEnumerable properties)
{
    var isCanParse = false;
    foreach (var property in properties)
    {
        //�������Ի�ȡ����
        var columnName = GetColumnName(property);
        if (!dataTable.Columns.Contains(columnName))
        {
            continue;
        }
        isCanParse = true;
    }
    return isCanParse;
}
//��������ӳ�䵽������
private static void MapRowToModel(DataRow dataRow, T model, IEnumerable properties)
{
    foreach (var property in properties)
    {
        //�������Ի�ȡ����
        var columnName = GetColumnName(property);
        if (!dataRow.Table.Columns.Contains(columnName))
        {
            continue;
        }
        //��ȡ��Ԫ��ֵ
        var value = dataRow[columnName];
        if (value != DBNull.Value)
        {
            //���������Ը�ֵ
            property.SetValue(model, Convert.ChangeType(value, property.PropertyType));
        }
    }
}

���������򵥵ĵ�Ԫ���ԣ�

[Fact]
public void ToModels()
{
    //��֤�������
    var table = TableHelper.Create>();
    var row1 = table.NewRow();
    row1[0] = "Id-11";
    row1[1] = "����-12";
    row1[2] = 33.13;
    table.Rows.Add(row1);
    var row2 = table.NewRow();
    row2[0] = "Id-21";
    row2[1] = "����-22";
    row2[2] = 33.23;
    table.Rows.Add(row2);
    var students = TableHelper.ToModels>(table);
    Assert.Equal(2, students.Count());
    Assert.Equal("Id-11", students.ElementAt(0).Id);
    Assert.Equal("����-12", students.ElementAt(0).Name);
    Assert.Equal(33.13, students.ElementAt(0).Age);
    Assert.Equal("Id-21", students.ElementAt(1).Id);
    Assert.Equal("����-22", students.ElementAt(1).Name);
    Assert.Equal(33.23, students.ElementAt(1).Age);
}

02���Ѷ��󼯺�ת��Ϊ����

�÷������Ȼ���ø��ݶ��󴴽����񷽷��õ�һ���հױ���Ȼ��ͨ�������ȡ������������ԣ�Ȼ��ѭ���������󼯺ϣ���һ���������������ֵһ��һ�������е��������У������������һ������ӳ��ɱ���һ�м�¼��ֱ�����ж���ת����ɼ��ɵõ�һ������

�������£�

//�Ѷ��󼯺�תΪ����
//�������DescriptionAttribute��������ֵ��Ϊ�����������
//�����������������������
public static DataTable ToDataTable(IEnumerable models, string? tableName = null)
{
    //��������
    var dataTable = Create(tableName);
    if (models == null || !models.Any())
    {
        return dataTable;
    }
    //��ȡ��������
    var properties = typeof(T).GetProperties().Where(u => u.CanRead);
    foreach (var model in models)
    {
        //������
        var dataRow = dataTable.NewRow();
        foreach (var property in properties)
        {
            //�������Ի�ȡ����
            var columnName = GetColumnName(property);
            //���������
            dataRow[columnName] = property.GetValue(model);
        }
        dataTable.Rows.Add(dataRow);
    }
    return dataTable;
}

�������µ�Ԫ���ԣ�

[Fact]
public void ToDataTable()
{
    //��֤�������
    var students = new List>();
    var student1 = new Student
    {
        Id = "Id-11",
        Name = "����-12",
        Age = 33.13
    };
    students.Add(student1);
    var student2 = new Student
    {
        Id = "Id-21",
        Name = "����-22",
        Age = 33.23
    };
    students.Add(student2);
    var table = TableHelper.ToDataTable>(students, "ѧ����");
    Assert.Equal("ѧ����", table.TableName);
    Assert.Equal(2, table.Rows.Count);
    Assert.Equal("Id-11", table.Rows[0][0]);
    Assert.Equal("����-12", table.Rows[0][1]);
    Assert.Equal("33.13", table.Rows[0][2].ToString());
    Assert.Equal("Id-21", table.Rows[1][0]);
    Assert.Equal("����-22", table.Rows[1][1]);
    Assert.Equal("33.23", table.Rows[1][2].ToString());
}

03����һά������Ϊһ��ת��Ϊ����

�÷����Ƚϼ򵥾��ǰ�һ��һά������Ϊһ�����ݴ���һ�ű���ͬʱ����ѡ���Ƿ���д����������������������£�

//��һά������Ϊһ��ת��Ϊ����
public static DataTable ToDataTableWithColumnArray(TColumn[] array, string? tableName = null, string? columnName = null)
{
    var dataTable = new DataTable(tableName);
    //������
    dataTable.Columns.Add(columnName, typeof(TColumn));
    //����������
    foreach (var item in array)
    {
        var dataRow = dataTable.NewRow();
        dataRow[0] = item;
        dataTable.Rows.Add(dataRow);
    }
    return dataTable;
}

��Ԫ�������£�

[Fact]
public void ToDataTableWithColumnArray()
{
    //��֤�������
    var columns = new string[] { "A", "B" };
    var table = TableHelper.ToDataTableWithColumnArray(columns, "ѧ����");
    Assert.Equal("ѧ����", table.TableName);
    Assert.Equal("Column1", table.Columns[0].ColumnName);
    Assert.Equal(2, table.Rows.Count);
    Assert.Equal("A", table.Rows[0][0]);
    Assert.Equal("B", table.Rows[1][0]);
    table = TableHelper.ToDataTableWithColumnArray(columns, "ѧ����", "��");
    Assert.Equal("��", table.Columns[0].ColumnName);
}

04����һά������Ϊһ��ת��Ϊ����

�÷���Ҳ�Ƚϼ򵥾��ǰ�һ��һά������Ϊһ�����ݴ���һ�ű���ͬʱ����ѡ���Ƿ���д����������������£�

//��һά������Ϊһ��ת��Ϊ����
public static DataTable ToDataTableWithRowArray(TRow[] array, string? tableName = null)
{
    var dataTable = new DataTable(tableName);
    //������
    for (var i = 0; i < array.Length; i++)
    {
        dataTable.Columns.Add(null, typeof(TRow));
    }
    //����������
    var dataRow = dataTable.NewRow();
    for (var i = 0; i < array.Length; i++)
    {
        dataRow[i] = array[i];
    }
    dataTable.Rows.Add(dataRow);
    return dataTable;
}

05������ת��

�÷�����ָ��DataTable�е��к��л����������е����ݱ���У��е����ݱ���С�����ͼʾ����

ʵÏÖ¶ÔÏ󼯺ÏÓëDataTableµÄÏ໥ת»»

���ʾ��ת������һ��������������û����Ϊ���ݽ���ת����������ǻ��ṩһ����ѡ���������ָʾҪ��Ҫ����Ŀ��Ϊ���ݽ���ת����

��������ʵ���߼�Ҳ�ܼ򵥣�������ԭ��������Ϊ��������һ���±���Ȼ����ѭ������ԭ�����У�����ԭ����һ������������±����һ�������У�ֱ��ԭ���������д���������������ת�á�����������£�

//����ת��
public static DataTable Transpose(DataTable dataTable, bool isColumnNameAsData = true)
{
    var transposed = new DataTable(dataTable.TableName);
    //���������Ϊ���ݣ�����Ҫ���һ��
    if (isColumnNameAsData)
    {
        transposed.Columns.Add();
    }
    //ת�ú�������Ϊ�µ�����
    for (int i = 0; i < dataTable.Rows.Count; i++)
    {
        transposed.Columns.Add();
    }
    //����Ϊ��λ��һ�δ���һ������
    for (var column = 0; column < dataTable.Columns.Count; column++)
    {
        //��������
        var newRow = transposed.NewRow();
        //���������Ϊ���ݣ����Ȱ����������һ��
        if (isColumnNameAsData)
        {
            newRow[0] = dataTable.Columns[column].ColumnName;
        }
        //��һ������תΪһ������
        for (var row = 0; row < dataTable.Rows.Count; row++)
        {
            //���������Ϊ���ݣ��������ݴӵڶ��п�ʼ���
            var rowIndex = isColumnNameAsData ? row + 1 : row;
            newRow[rowIndex] = dataTable.Rows[row][column];
        }
        transposed.Rows.Add(newRow);
    }
    return transposed;
}

������м򵥵ĵ�Ԫ���ԣ�

[Fact]
public void Transpose_ColumnNameAsData()
{
    DataTable originalTable = new DataTable("����");
    originalTable.Columns.Add("A", typeof(string));
    originalTable.Columns.Add("B", typeof(int));
    originalTable.Columns.Add("C", typeof(int));
    originalTable.Rows.Add("D", 1, 2);
    //������Ϊ���ݵ����
    var table = TableHelper.Transpose(originalTable, true);
    Assert.Equal(originalTable.TableName, table.TableName);
    Assert.Equal("Column1", table.Columns[0].ColumnName);
    Assert.Equal("Column2", table.Columns[1].ColumnName);
    Assert.Equal(3, table.Rows.Count);
    Assert.Equal("A", table.Rows[0][0]);
    Assert.Equal("D", table.Rows[0][1]);
    Assert.Equal("B", table.Rows[1][0]);
    Assert.Equal("1", table.Rows[1][1].ToString());
    Assert.Equal("C", table.Rows[2][0]);
    Assert.Equal("2", table.Rows[2][1].ToString());
}

ע �����Է��������Լ�ʾ��Դ�붼�Ѿ��ϴ�������⣬����Ȥ�Ŀ��Կ����� https://gitee.com/hugogoos/Ideal

С���Ƽ��Ķ�

�������������Ľ�Ϊ������Ϣ����������������ͬ���޹۵��֤ʵ��������

a 1.0
a 1.0
���ͣ���������������Ӫ״̬����ʽ��Ӫ�������ԣ����� ����

��Ϸ����

��Ϸ���

��Ϸ��Ƶ

��Ϸ����

��Ϸ�

��alittletotheleft������������һ��ܻ�ӭ����������������Ϸ����ҵ������Ƕ��ճ������еĸ���������

�����Ƶ����

����

ͬ������

����

ɨ��ά�����������ֻ��汾��

ɨ��ά����������΢�Ź��ںţ�

��վ�������������������ϴ��������ַ���İ�Ȩ���뷢�ʼ�[email protected]

��ICP��2022002427��-10 �湫��������43070202000427��© 2013~2025 haote.com ������