来自 SQL 查询的 Linq 数据透视表
Linq Pivot from SQL Query
我对 Linq 有疑问,代码过去是通过存储过程在 sql 中处理的,但现在它应该通过 linq 在代码上处理,这是我的数据库模式
我想要的是,来自这个数据
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; }
}
我对 Linq 有疑问,代码过去是通过存储过程在 sql 中处理的,但现在它应该通过 linq 在代码上处理,这是我的数据库模式
我想要的是,来自这个数据
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; }
}