【问题标题】:Linq Pivot from SQL Query来自 SQL 查询的 Linq Pivot
【发布时间】:2021-10-18 16:57:58
【问题描述】:

我对 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 - Stackoverflow,当我尝试我的代码时,我遇到了 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,
        });
}

【问题讨论】:

  • 将其更改为GroupBy(l =&gt; l.OrderNo) 并将BE = g.FirstOrDefault(x=&gt; x.Type == "BE" &amp;&amp; x.OrderNo == g.Key).Serial 添加到匿名对象中。

标签: c# sql linq pivot


【解决方案1】:

您可以通过将按元素 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; }
    }

【讨论】:

    猜你喜欢
    • 2021-09-27
    • 1970-01-01
    • 1970-01-01
    • 2016-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多