Linq to sql 使用F#linq2sql序列处理连接的表

Linq to sql 使用F#linq2sql序列处理连接的表,linq-to-sql,f#,Linq To Sql,F#,教我如何提高我的F#linql序列 在这里,我使用的是linq2sql,但我认为它有问题 这里的主要问题是通过ID进行访问,在我制作2 embedded的示例中,但我得到了非常可怕的linq2 sql查询,因为我不知道是否有其他方法或方法来实现它 member X.deltaArchive() = // Reacting on delta limits seq { for a in db.ArchiveAnalogs do for d in db.Deltas d

教我如何提高我的F#linql序列

在这里,我使用的是linq2sql,但我认为它有问题

这里的主要问题是通过ID进行访问,在我制作2 embedded的示例中,但我得到了非常可怕的linq2 sql查询,因为我不知道是否有其他方法或方法来实现它

member X.deltaArchive() = // Reacting on delta limits
    seq { for a in db.ArchiveAnalogs do
            for d in db.Deltas do
                if a.ID = d.ID then
                    if a.Value > d.DeltaLimit then
                        yield d.AboveMessage
                    else if a.Value < d.DeltaLimit then
                        yield d.BelowMessage
        } |> Array.ofSeq

offtopic:我必须找到解决方案,因为这是关于“F#linq2sql”的第一个谷歌链接。

首先,您编写的代码片段并没有真正使用linqtosql。您正在内存中运行整个处理过程,因为F#不会根据类型选择查询运算符(就像C#那样)。要在SQL上运行查询,需要显式标记查询:

#r "FSharp.PowerPack.Linq.dll"
open Microsoft.FSharp.Linq

<@ seq { for a in db.ArchiveAnalogs do ... } @> |> query

(尽管如此,我认为使用
join
和嵌套
for
之间实际上没有什么区别-如果您在SQL上运行此操作,它可能会对其进行优化以进行连接)。

如果我需要生成a.Date,d.overmessage,turples呢?您应该能够返回元组-至少在LINQ to SQL中是这样。(顺便说一句:对不起,我第一次发布时复制的样本不正确)是的,谢谢,但是我在元组方面遇到了问题。检查第一个帖子“添加”。这可能是一个PP错误吗?@nCdy-是的,看起来像一个错误,但很奇怪。你能试着把
if
展平,这样你就不会有嵌套的
if
s了吗?可能是这导致了问题(请向microsoft com上的fsbugs报告)
    The following construct was used in query but is not recognised by the F#-to-LINQ query translator:
Call (None,
      System.Collections.Generic.IEnumerable`1[System.Tuple`2[System.DateTime,System.String]] Singleton[Tuple`2](System.Tuple`2[System.DateTime,System.String]),
      [NewTuple (PropertyGet (Some (a), System.DateTime Date, []),
                 PropertyGet (Some (d), System.String AboveMessage, []))])
This is not a valid query expression. Check the specification of permitted queries and consider moving some of the query out of the quotation
#r "FSharp.PowerPack.Linq.dll"
open Microsoft.FSharp.Linq

<@ seq { for a in db.ArchiveAnalogs do ... } @> |> query
<@ join db.ArchiveAnalogs db.Deltas (fun a -> a.ID) (fun d -> d.ID) (fun a d ->
     if a.Value > d.DeltaLimit then
         yield d.AboveMessage
     else if a.Value < d.DeltaLimit then
         yield d.BelowMessage ) @> |> query