来自 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 => l.OrderNo)
并将BE = g.FirstOrDefault(x=> x.Type == "BE" && 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的主要内容,如果未能解决你的问题,请参考以下文章