Linq或Tsql'Pivot'

Rob*_*Rob 2 c# linq sql-server pivot

我确信这在其他地方有所涉及,但我遇到了一些问题,想出一个优雅的解决方案.

ID  C     D
1   Apple Red
1   Pear  Orange
2   Apple Red 
2   Pear  Orange
Run Code Online (Sandbox Code Playgroud)

我想要最终得到的是:

ID  | Benefit | Value
1   | C       | Apple
1   | C       | Pear
2   | C       | Apple
2   | C       | Pear
1   | D       | Red
1   | D       | Orange
2   | D       | Red
2   | D       | Orange
Run Code Online (Sandbox Code Playgroud)

我可以在Linq中扫描每一列并添加到列表中.

public class SampleRow
{
    public Int32 Id { get; set; }
    public String A { get; set; }
    public String B { get; set; }        
}

public class SampleOutput
{
    public Int32 Id { get; set; }
    public String Description { get; set; }
    public String Value { get; set; }  

}

        List<SampleRow> rows = new List<SampleRow>();
        rows.Add(new SampleRow
        {
            Id = 1,
            A = "Apple",
            B = "Red"
        });
        rows.Add(new SampleRow
        {
            Id = 1,
            A = "Pear",
            B = "Orange"
        });
        rows.Add(new SampleRow
        {
            Id = 2,
            A = "Apple",
            B = "Red"
        });
        rows.Add(new SampleRow
        {
            Id = 2,
            A = "Pear",
            B = "Orange"
        });


        List<SampleOutput> output = new List<SampleOutput>();
        rows.ForEach(row =>
            output.Add(new SampleOutput()
            {
                Id = row.Id,
                Description = "A",
                Value = row.A
            })
            );
        rows.ForEach(row =>
            output.Add(new SampleOutput()
            {
                Id = row.Id,
                Description = "B",
                Value = row.B
            })
            );
Run Code Online (Sandbox Code Playgroud)

我想知道是否有更好的方法.我对Linq或TSQL解决方案持开放态度.数据存储在SQL中,就像第一个表/对象列表一样.

CrA*_*HeR 6

我认为干净而优雅的解决方案是使用UNPIVOT.

SELECT
  ID, Benefit, Value
FROM
  Test
UNPIVOT
  (Value FOR Benefit IN (C, D)) unpvt
ORDER BY
  Benefit, ID
Run Code Online (Sandbox Code Playgroud)

在这里你有一个工作演示
http://sqlfiddle.com/#!6/12884/9

希望这可以帮助