F# 按多列分组,然后投影
在下面的代码中,我试图返回一个新的序列类型,该序列类型根据原始序列中的ProductName、Size和Package属性进行分组,但我得到的是一个未分组的新类型序列。我错过了什么F# 按多列分组,然后投影,f#,f#-3.0,F#,F# 3.0,在下面的代码中,我试图返回一个新的序列类型,该序列类型根据原始序列中的ProductName、Size和Package属性进行分组,但我得到的是一个未分组的新类型序列。我错过了什么 query{ for row in allDeliveries do let key = AnonymousObject<_,_,_>(row.ProductName,row.Size,row.Packaging) groupValBy row key in
query{
for row in allDeliveries do
let key = AnonymousObject<_,_,_>(row.ProductName,row.Size,row.Packaging)
groupValBy row key into g
select g
}
|> Seq.map (fun (del) ->
{
POFD = del;
ProductName = del.Key.Item1;
Size = del.Key.Item2;
Packaging = del.Key.Item3;
Quantity = del.Count()
})
查询{
对于所有交付中的行,请执行以下操作:
let key=AnonymousObject(row.ProductName、row.Size、row.Packaging)
groupValBy行键进入g
选择g
}
|>Seq.map(乐趣(del)->
{
POFD=del;
ProductName=del.Key.Item1;
尺寸=del.Key.Item2;
包装=del.Key.Item3;
数量=删除计数()
})
这是我的解决方案:
query{
for row in allDeliveries do
groupValBy row (row.ProductName, row.Size, row.Packaging) into g
select {
POFD = g;
ProductName = query{
for row2 in g do
select row2.ProductName
headOrDefault
}
Size = query{
for row2 in g do
select row2.Size
headOrDefault
}
Packaging = query{
for row2 in g do
select row2.Packaging
headOrDefault
}
Quantity = g.Count()
}
}
我认为,
匿名对象
不会实现某种等价性检查-为什么不使用像groupValBy row(row.ProductName、row.Size、row.Packaging)这样的普通F元组
?为什么不使用select
部分直接获取记录呢?请参阅。。。tuples为你做的;)@卡斯滕克ö;几乎是的,你应该把它作为一个答案贴出来,:-)不,没关系。。。如果你接受你自己的,我希望你能得到一些名声。。。有一些+1;)