我不知道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. |
我也想知道如果我可以創建這個排序爲我一個SQL函數。但我還沒有發現使用SQL函數從MVC4又一個很好的方式..即。我用手寫函數很好,但我寧願使用一些調用該函數的MVC-ish方法。 – JensB
這是否必須在'linq'中完成?這可以很容易地用存儲過程中的動態SQL完成,具體取決於您的RDBMS。 – Taryn
我寧願在LINQ中這樣做,但如果沒有其他選項存在,我可以向任何高效且快速的「良好」解決方案開放。 – JensB