2013-01-07 110 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