动态转动未知数据

时间:2013-01-07 16:07:56

标签: c# sql-server linq asp.net-mvc-4 lambda

尝试使用C#/ MVC4中的LINQ或LAMBDA来转移动态数据,并且几乎得出结论,它很难做到。

这基本上就是我想做的事情: Pivot

我已经能够使用此示例使用已知列名称来使用它:http://geekswithblogs.net/malisancube/archive/2009/04/21/using-lambda-or-linq-for-pivot-tables.aspx

但我找不到使用动态列做这个的任何示例。

通过动态列我的意思是可能有一个新的行,其中有一个不同的Name和FieldType,在任何时候都没有在表中,也需要变成一个列..任何指针?。

1 个答案:

答案 0 :(得分:2)

我不知道LINQ所以我会给你一个可以在SQL Server存储过程中使用的版本。这种类型的数据转换称为PIVOT。由于您使用的是SQL Server 2008+,因此可以使用该功能。

如果您知道要转换的值,则可以对值进行硬编码:

SELECT nodeid, rowid,[FirstName], [LastName], [Title]
FROM
(
    SELECT nodeid, rowid, name, value
    FROM yourTable
) x
PIVOT
(
   max(value)
   for name in ([FirstName], [LastName], [Title])
)p

请参阅SQL Fiddle with Demo

然后,如果您有未知数量的值,则可以实现动态SQL:

DECLARE @cols AS NVARCHAR(MAX),
    @query  AS NVARCHAR(MAX)

select @cols = STUFF((SELECT distinct ',' + QUOTENAME(name) 
                    from yourtable
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

set @query = 'SELECT nodeid, rowid,' + @cols + ' from 
             (
                SELECT nodeid, rowid, name, value
                FROM yourTable
            ) x
            pivot 
            (
                max(value)
                for name in (' + @cols + ')
            ) p '

execute(@query)

请参阅SQL Fiddle with Demo

两者都返回结果:

| NODEID | ROWID | FIRSTNAME | LASTNAME |  TITLE |
--------------------------------------------------
|      1 |     1 |    Alfred |   Beagle | (null) |
|      1 |     2 |    Freddy |   (null) | (null) |
|      1 |     3 |    (null) |     Grey |   Sir. |