在 C# 中将一对多关系中的结构化记录转换为对象列表



我的表格结构如下:

PrimaryKey |ColumnDesc   |ColumnValue
------------------------------------
Object1    |Name - First |Steve
Object1    |Height - in  |60
Object1    |Weight - lbs |180.3
Object2    |Name - First |Edward
Object2    |Height - in  |62
Object2    |Weight - lbs |200.0

当我从数据库中提取数据时,我想将其从上面的结构转换为对象列表,具有以下类结构:

public class Person
{
public string Name { get; set; }
public int Height { get; set; }
public double Weight { get; set; }
}

这样,它可以保存到另一个表(称为 Person(,其结构如下所示:

PersonId |Name   |Height  |Weight
---------------------------------
10000    |Steve  |60      |180.3
10001    |Edward |62      |200.0

我很难找出最好的方法来做到这一点。我设想像这样设置一个映射表:

OriginalColumName |NewColumnName|DataType
-----------------------------------------
Name - First      |Name         |string
Height - in       |Height       |int
Weight - lbs      |Weight       |double

一种方法将根据"PrimaryKey"字段对第一个表结构中的记录进行分组,然后使用映射表和反射为每个对象分配值和类型。我正在努力想出正确的语法来完成这一点(特别是关于不同的类型(,我想知道是否有一种更简洁和合乎逻辑的方法在代码中满足这一要求。是否有更好的解决方案已经存在,或者是否有人对实现这一目标的最佳途径有建议?

如果第一个表被称为table1,那么这将在SQL中工作 - 你可以在插入语句中使用它来制作person表。

SELECT BASE.primarykey, first.columnvalue as name, height.columnvalue as height, weight.columnvalue as weight
FROM (
SELECT DISNTCT PrimaryKey 
FROM table1
) as BASE
LEFT JOIN table1 as first on base.primarykey = first.primarykey and first.columndesc = 'Name - First' 
LEFT JOIN table1 as height on base.primarykey = height.primarykey and height.columndesc = 'Height - in' 
LEFT JOIN table1 as weight on base.primarykey = weight.primarykey and weight.columndesc = 'Weight - lbs' 

根据您的数据库和用于连接它的方法,我相信这将是数据透视表的好地方:

假设表数据透视测试如下所示:

CREATE TABLE PivotTest (
PrimaryKey int not null,
ColumnDesc varchar(30),
ColumnValue varchar(100)
)
INSERT INTO PivotTest (PrimaryKey, ColumnDesc, ColumnValue)
VALUES
-- PrimaryKey,   ColumnDesc, ColumnValue 
(     10000, 'Name-First',      'Steve'),
(     10000,  'Height-In',         '60'),
(     10000, 'Weight-Lbs',      '180.3'),
(     10001, 'Name-First',     'Edward'),
(     10001,  'Height-In',         '62'),
(     10001, 'Weight-Lbs',      '200.0')

在 SQL SERVER 中使用数据透视表,语法如下所示:

SELECT * 
FROM
(SELECT 
Id,
Data,
Description
FROM PivotTest) AS Pvt
PIVOT (
MIN(Data)
FOR Description IN ([Name - First], [Height - in], [Weight - lbs])
) AS Result

以下是一些有用的链接,可以进一步解释PIVOT和UNPIVOT:

Microsoft

神谕

编码视线

最新更新