F# F查询联接/组/聚合?

F# F查询联接/组/聚合?,f#,f#-3.0,F#,F# 3.0,我怎样才能让F做与 select a.id, avg(case when a.score = b.score then 1.0 else 0.0 end) from table1 a join table2 b on a.id = b.id and a.date = b.date group by a.id 在查询表达式中?我想出了一个好主意 query { for a in db.table1 do join b in db.table2 on ((a.id, a.date)

我怎样才能让F做与

select a.id, avg(case when a.score = b.score then 1.0 else 0.0 end)
from table1 a join table2 b on a.id = b.id and a.date = b.date
group by a.id
在查询表达式中?我想出了一个好主意

query {
    for a in db.table1 do
    join b in db.table2 on ((a.id, a.date) = (b.id, b.date))
    groupBy a.id into g
    select (g.Key, ???) }
但我不知道该插入什么???。更糟糕的是,score列可以为null,这使数学变得复杂


或者,有没有更简单的方法来实现这一点?我对.NET数据库访问不是很熟悉。理想情况下,我只需要给它一个SQL块,它将解析它,并吐回一些类型化的数据。事实上,试图找出直截了当的SQL的not SQL语法是相当令人沮丧的。

转换为SQL通常可以更好地处理C风格的LINQ操作,而不是本机F函数。因此,使用Select和Average扩展方法比使用标准F函数(如Seq.map和Seq.Average)更容易

我尝试使用一个示例Northwind数据库编写一个类似的分组-我没有找到好的表来连接,但是下面使用CASE进行基本聚合,效果很好:

open System.Linq

query {
    for p in db.Products do
    groupBy p.CategoryID.Value into g
    select (g.Key, g.Select(fun a -> 
      if a.UnitPrice.Value > 10.0M then 1.0 else 0.0).Average()) }
|> Array.ofSeq

它生成了一个稍微复杂一点的查询,但是看起来很正确,并且在SQL端使用了CASE。您可以通过设置db.DataContext.Log几年后看到这一点,但永远不会太迟?这有什么帮助吗?特别要注意FirstOrDefault的使用。对不起,挪威人的名字,但这并不重要。x显示了对第一个表的访问

type Result3 = { Aarsak: int; Beskrivelse: string; Antall: int; Varighet: Nullable<int> }
let query3 = query {
    for stopptid in dc.StoppTider do
    where (stopptid.DatoS = datoS && stopptid.SkiftNr = skiftNr)
    groupBy stopptid.Aarsak into g
    join stoppaarsak in dc.StoppAarsak on (g.FirstOrDefault().Aarsak.ToString() = stoppaarsak.Nr)
    select { Aarsak = g.Key; Beskrivelse = stoppaarsak.Norsk; Antall = g.Count(); Varighet = g.Sum(fun x -> x.Varighet) }
    }
我第一次来到这里是在谷歌搜索的时候。由于没有帮助,我在谷歌上搜索了C中的等效解决方案,得到了成功,使其适用于我在C中的案例,然后在F中。这是链接:


我可以确认嵌套查询也可以工作。选择g.Key,查询{for a in g do averageBy如果a.UnitPrice.Value>10.0M,那么1.0 else 0.0}@Tarmil我仍然无法在我的数据上使用它。连接似乎使事情复杂化了。我似乎没有在任何地方安装Northwind,但您是否可以尝试通过e.EmployeeID=p.ProductName然后1.0 else 0.0结束从员工e加入e.EmployeeID=p.ProductID组上的p产品e.EmployeeID=p.ProductID的等效无意义查询?当我尝试将g解包为e、p的元组时,我获得了非法的成员访问权限。Average和.Select调用需要完整的类型规范,然后在某些参数上失败“value”是错误的类型错误。我尝试了类似的操作,我认为这是一个错误:。您是否收到相同类型的错误消息?是的,当我尝试使用子查询时收到相同的错误消息。当我尝试使用g.Select。。。调用时,我需要显式键入调用fun a1,b1:db.ServiceTypes.Table1*db.ServiceTypes.Table2->…,即使这样,我也会得到一个System.ArgumentException:参数“value”的类型错误。应为'System.Func2[System.Nullable1[System.Int32],System.Nullable1[System.Double]'。实际的“System.Nullable1[System.Double]”。错误,我完全不理解。