1

尝试在 C#/MVC4 中使用 LINQ 或 LAMBDA 对动态数据进行透视,并且几乎得出结论,这很难做到。

这基本上是我想要做的: 枢

我已经能够使用此示例使其与已知列名一起使用:http: //geekswithblogs.net/malisacube/archive/2009/04/21/using-lambda-or-linq-for-pivot-tables.aspx

但我找不到任何使用动态列执行此操作的示例。

通过动态列,我的意思是可能有一个具有不同名称和字段类型的新行,该行之前在任何时候都没有出现在表中,也需要变成一列......任何指针?

4

1 回答 1

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

然后如果你有未知数量的值,你可以实现动态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

两者都返回结果:

| NODEID | ROWID | FIRSTNAME | LASTNAME |  TITLE |
--------------------------------------------------
|      1 |     1 |    Alfred |   Beagle | (null) |
|      1 |     2 |    Freddy |   (null) | (null) |
|      1 |     3 |    (null) |     Grey |   Sir. |
于 2013-01-07T16:28:41.993 回答