来自 SQL 查询的 Linq 数据透视表

Linq Pivot from SQL Query

我对 Linq 有疑问,代码过去是通过存储过程在 sql 中处理的,但现在它应该通过 linq 在代码上处理,这是我的数据库模式

SQL Fiddle

我想要的是,来自这个数据

orderNo Type serial
1 BN BN 1
1 BE BE 1
2 BN BN 2
2 BE BE 2
3 BN BN 3
3 BE BE 3

变成这样:

orderNo be bn
1 BE 1 BN 1
2 BE 2 BN 3
3 BE 2 BN 3

找到一个问题和解决方案 Source 1 - Whosebug ,当我尝试我的代码时,我遇到了 SelectMany

的问题

这是我试过的方法

var results = data_tech.GroupBy(l => l.serial).SelectMany( g => 
                     new 
                     { 
                         Metadata = g.Key, 
                         data = g 
                     });


 var pivoted = new List<PivotedEntity>();

foreach(var item in results)
{
    pivoted.Add( 
        new PivotedEntity
        {
            Order= item.orderNo,
            BE= item.data.Where(x => x.Name == "BE")
                        .FirstOrDefault().value,
            BN= item.data.Where(x => x.Name == "BN")
                         .FirstOrDefault().value,
        });
}

您可以通过将按元素 serial 更改为 OrderNo 来简单地实现此目的。让我举个例子,

        var list = new List<Order>() {
            new Order { orderNo = 1, Type = "BN", Serial = "BN 1" },
            new Order { orderNo = 1, Type = "BE", Serial = "BE 1" },
            new Order { orderNo = 2, Type = "BN", Serial = "BN 2" },
            new Order { orderNo = 2, Type = "BE", Serial = "BE 2" },
            new Order { orderNo = 3, Type = "BN", Serial = "BE 3" } ,
            new Order { orderNo = 3, Type = "BE", Serial = "BN 3" } };

            var results = list.GroupBy(l => l.orderNo).Select(g =>
                new
                {
                    Metadata = g.Key,
                    data = g
                });

            var pivoted = new List<PivotedEntity>();

            foreach (var item in results)
            {
                pivoted.Add(
                    new PivotedEntity
                    {
                        Order = item.Metadata,
                        BE = item.data.Where(x => x.Type == "BE")
                                    .FirstOrDefault().Serial,
                        BN = item.data.Where(x => x.Type == "BN")
                                     .FirstOrDefault().Serial,
                    });
            }

这会给你一些像这张图片的输出。

编辑:输出 PivotedEntity class =>

internal class PivotedEntity
    {
        public int Order { get; set; }
        public string BE { get; set; }
        public string BN { get; set; }
    }