来自 SQL 查询的 Linq Pivot

Posted

技术标签:

【中文标题】来自 SQL 查询的 Linq Pivot【英文标题】:Linq Pivot from SQL Query 【发布时间】: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 - ***,当我尝试我的代码时,我遇到了 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,
        );

【问题讨论】:

idownvotedbecau.se/noattempt 将其更改为GroupBy(l =&gt; l.OrderNo) 并将BE = g.FirstOrDefault(x=&gt; x.Type == "BE" &amp;&amp; x.OrderNo == g.Key).Serial 添加到匿名对象中。 【参考方案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; 
    

【讨论】:

以上是关于来自 SQL 查询的 Linq Pivot的主要内容,如果未能解决你的问题,请参考以下文章

LINQ to SQL:对来自订购系统的多个表的报告的聚合数据进行复杂查询

识别 linq to sql 查询的来源

如何使用 LINQ 或 HQL 执行以下 SQL 查询

使用 PIVOT 的 SQL 查询

sql SQL Pivot查询示例。

SQL 查询两个 PIVOT 列组合