2017-01-26 38 views
1

我有以下几点:LINQ UNPIVOT一些列

1_A | 1_B | 2_A | 2_B | 3_A | 3_B | 
------+-------+-------|-------+-------+---------| 
10 | 100 | 12 | 50 | 300 | 52 | 

,它应该成为:

Type | A | B | 
------+-------+-------| 
1  | 10 | 100 | 
2  | 12 | 50 | 
3  | 300 | 52 | 

它是可行的LINQ?如果不是,SQL Server中最有效的查询是什么?

感谢

S.

回答

1

这取决于LINQ查询供应商的能力,但在一般的LINQ的解决方案是使用SelectMany方法:

var query = db.Table 
    .SelectMany(e => new[] 
    { 
     new { Type = 1, A = e.A1, B = e.B1 }, 
     new { Type = 2, A = e.A2, B = e.B2 }, 
     new { Type = 3, A = e.A3, B = e.B3 }, 
    }; 
+1

谢谢@ ivan-stoev。完美的解决方案,更好地结合复杂查询中的每组列。 – sylvain77

+0

欢迎您,很高兴帮助:) –

1
在SQL

尽可能最好的方式是使用CROSS APPLY

SELECT [Type], A, B 
FROM Yourtable 
     CROSS apply(VALUES (1,[1_A],[1_B]), 
          (2,[2_A],[2_B]), 
          (3,[3_A],[3_B])) tc ([Type], A, B) 
+0

感谢整齐例。如果有直接的LINQ解决方案,将会继续探索,否则将使用您的解决方案作为SQL服务器中的视图,或者将EFI Core作为我的控制器中的原始SQL。欢呼声 – sylvain77

0

不知道有关LINQ,但您可以在使用CROSS APPLY像这样的SQL:

with t([1_A] , [1_B] , [2_A] , [2_B] , [3_A] , [3_B]) as (
select 10 , 100 , 12 , 50 , 300 , 52 ) 
------ Test data setup ends here ------ 

select 
    x.* 
from t 
cross apply (
    values 
     (1, [1_A],[1_B]), 
     (2, [2_A],[2_B]), 
     (3, [3_A],[3_B]) 
) x (type, A, B); 

产地:

enter image description here