【问题标题】:F# linq2SQL bug or my fail?F# linq2SQL 错误还是我的失败?
【发布时间】:2011-02-21 09:08:00
【问题描述】:

我已经将 bug 发送到 fsbugs@microsoft.com 我还添加了这个链接到信函以获取更多描述、代码突出显示、讨论和 也许有人会找到一些方法来避免它,因为我真的很喜欢并且想用。

代码:

<@ 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 a.Date, d.AboveMessage
                    else if a.Value < d.DeltaLimit then
                        yield a.Date, d.BelowMessage}
     @> |> query |> Array.ofSeq

与更新相同的错误消息:

   <@ seq {for a in db.ArchiveAnalogs do
                        for d in db.Deltas do
                            if a.ID = d.ID && a.Value > d.DeltaLimit then
                                yield a.Date, d.AboveMessage
                            elif a.ID = d.ID && a.Value < d.DeltaLimit then
                                yield a.Date, d.BelowMessage}
                 @> |> query |> Array.ofSeq

错误信息:

The following construct was used in query but is not recognised by the

F#-to-LINQ 查询转换器:调用 (没有任何, System.Collections.Generic.IEnumerable1[System.Tuple2[System.DateTime,System.String]] Singleton[Tuple2](System.Tuple2[System.DateTime,System.String]), [NewTuple (PropertyGet (Some (a), System.DateTime Date, []), PropertyGet(一些(d),System.String AboveMessage, []))]) 这不是一个有效的查询 表达。检查规格 允许查询并考虑搬家 引用中的一些查询

已修复

代码:

    let px =
        query <| 
        <@ seq { for cl in db.Dictionaries -> cl }
                    |> Seq.filter(fun x -> x.ID_Line = l1 || x.ID_Line = l2) @>
        |> fun pquery ->
            query <|
            <@ seq { for cd in db.DeltaCompares do
                        for cl1 in pquery do
                                            if cd.IID1 = cl1.IID then
                                                for cl2 in pquery do
                                                    if cd.IID2 = cl2.IID then
                                                        yield cl1
                                                        yield cl2 } @>
            |> List.ofSeq

更新同样的错误:

            let p =
                [for cl in db.Dictionaries -> cl]
                |> Seq.filter(fun x -> x.ID_Line = l1 || x.ID_Line = l2)
                |> fun pquery ->
                    <@ seq { for cd in db.DeltaCompares do
                                for cl1 in pquery do
                                    for cl2 in pquery do
                                    if cd.IID1 = cl1.IID && cd.IID2 = cl2.IID then
                                        yield cl1, cl2 } @>
                    |> query |> Seq.collect(fun a -> [fst a; snd a])

错误信息:

查询中使用了以下构造,但未使用 由 F#-to-LINQ 查询识别 翻译:呼叫(无, System.Collections.Generic.IEnumerable`1[LinqBase.Dictionary] 单例字典, [cl1]) 这不是一个有效的查询表达式。检查规格 允许查询并考虑搬家 引用中的一些查询

固定

我不确定我是否正确,所以我还请你确认这是一个错误还是不是一个错误

【问题讨论】:

    标签: linq-to-sql f#


    【解决方案1】:

    第一种情况中,我认为 F#-to-LINQ 转换器可能在嵌套 if 上失败。你有没有试过:(...)

    编辑 [第二次尝试]:它也可能失败,因为我们使用 if 而没有 else 子句。如果你总是使用 option 类型返回一些东西,然后过滤掉 None 值(可能有一种方法可以让它更好,但让我们从这个开始):

    <@ seq {for a in db.ArchiveAnalogs do
                for d in db.Deltas do
                  yield
                    if a.ID = d.ID && a.Value > d.DeltaLimit then
                      Some(a.Date, d.AboveMessage)
                    elif a.ID = d.ID a.Value < d.DeltaLimit then 
                      Some(a.Date, d.BelowMessage)
                    else None }
         @> |> query |> Seq.choose id |> Array.ofSeq
    

    第二种情况中,可能会因为for 嵌套在if 中而失败。我会试试这个(...)

    编辑:这实际上是对 LINQ 的错误使用(而且它在 C# 中也不起作用)。问题是您正在内存中收集一些数据 (pquery),然后将其作为输入传递给 LINQ(这样它就必须将数据发送回 SQL 服务器。

    你可以试着这样写(顺便说一句:我认为使用|&gt; fun x -&gt; 是一个奇怪的结构,因为你可以只使用let 来写同样的东西):

    let pquery = <@ db.Dictionaries
                |> Seq.filter(fun x -> x.ID_Line = l1 || x.ID_Line = l2) @>
    let px = 
      <@ seq { for cd in db.DeltaCompares do
                 for p in %pquery do ... } |> query
    

    这是使用引号拼接。有关此功能的更多信息,see my article(搜索拼接)。

    【讨论】:

    • 错误仍然与更新的代码相同。毕竟我看到有一些解决方法可以手动添加,但我找不到它们,我不知道这是否可以帮助我。
    • @nCdy:我为第一个案例添加了另一个尝试。
    • @nCdy... 以及为什么第二个实际上是错误的解释。 (主要错误不是bug,但可能涉及其他bug)
    猜你喜欢
    • 2017-11-14
    • 2014-02-10
    • 1970-01-01
    • 2022-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多