[C#]Linq 或 Tsql '支点'

标签: Linq SQLServer C#
发布时间: 2017/2/27 6:08:52
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

我敢肯定这覆盖在其他地方,但我有一些问题,为此找出一个优雅的解决方案。

ID  C     D
1   Apple Red
1   Pear  Orange
2   Apple Red 
2   Pear  Orange

这就是想落得什么︰

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

我能做到在 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
            })
            );

我想知道是否有更好的方式。打开到 Linq 或 TSQL 解决方案 !数据存储在 SQL 中像第一个表/对象列表。

解决方法 1:

我认为干净和优雅的解决方案是使用逆透视。

SELECT
  ID, Benefit, Value
FROM
  Test
UNPIVOT
  (Value FOR Benefit IN (C, D)) unpvt
ORDER BY
  Benefit, ID

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

希望这有助于

官方微信
官方QQ群
31647020