2013-01-07 71 views
1

试图转动在C#/ MVC4使用LINQ或LAMBDA 动态数据,并已几乎得出的结论是,它很难做..动态透视未知数据

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

我已经能够得到这个使用已知列名这个例子的工作:http://geekswithblogs.net/malisancube/archive/2009/04/21/using-lambda-or-linq-for-pivot-tables.aspx

但我不能找到与动态列做任何的例子。

动态列我的意思是可能有一个不同的名称和FieldType的新行,在任何时候也不需要在任何时候,也需要变成一个列..任何指针?

+0

我也想知道如果我可以创建这个排序为我一个SQL函数。但我还没有发现使用SQL函数从MVC4又一个很好的方式..即。我用手写函数很好,但我宁愿使用一些调用该函数的MVC-ish方法。 – JensB

+1

这是否必须在'linq'中完成?这可以很容易地用存储过程中的动态SQL完成,具体取决于您的RDBMS。 – Taryn

+0

我宁愿在LINQ中这样做,但如果没有其他选项存在,我可以向任何高效且快速的“良好”解决方案开放。 – JensB

回答

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. | 
+0

很好的答案,我会回家测试。想知道如果有什么特别的我需要考虑有关SQL注入..值和名称列可以基本上包含任何东西。 – JensB

+0

得到这个工作,你描述它,试图看看我是否可以微调到一个单一的选择语句;) – JensB

+0

@JensBerfenfeldt很高兴你得到它的工作。你可能可以,为了清晰起见,我将它分开。 :) – Taryn