Проблема с запросами SQL и Series / Type - PullRequest
1 голос
/ 10 апреля 2019

Вот мой код для запроса плавающего DateTime * из моей базы данных SQL (я использую: open FSharp.Data.TypeProviders)

    type FxTS = Series<DateTime,float>

    let get (req: RFxTS) =
        query { for d in db.Data_FXBFIX do
                where (d.Fxpair = (req.FxPair.ToString())
                    && (d.DatetimeUTC.Date >= req.Period.startDate)
                    && (d.DatetimeUTC.Date <= req.Period.endDate))
                sortBy d.DatetimeUTC
                select (d.DatetimeUTC, d.Value) }
        |> Series.ofObservations
        |> FxTS

И я получаю ошибку в FxTS: (когда я удаляюFxTS, я вижу, что эта функция действительно возвращает Series

Type constraint mismatch. The type 
    'Series<DateTime,float>'    
is not compatible with type
    'seq<Collections.Generic.KeyValuePair<DateTime,float>>' 

Спасибо

Ответы [ 2 ]

2 голосов
/ 10 апреля 2019

Что я хотел бы добавить к ответу @ zyzhu, так это то, что

|> FxTS

является избыточным.По сути, вы можете просто обойтись без явной аннотации типа

let get (req: RFxTS) : FxTS =
        query { for d in db.Data_FXBFIX do
                where (d.Fxpair = (req.FxPair.ToString())
                    && (d.DatetimeUTC.Date >= req.Period.startDate)
                    && (d.DatetimeUTC.Date <= req.Period.endDate))
                sortBy d.DatetimeUTC
                select (d.DatetimeUTC, d.Value) }
        |> Series.ofObservations

, как только FxTS будет просто псевдонимом типа, для Series<DateTime,float> компилятор ожидает, что он будет иметь те же конструкторы, что и Series, и один изони действительно seq<Collections.Generic.KeyValuePair<DateTime,float>>

2 голосов
/ 10 апреля 2019

Series.ofObservation работает с последовательностью кортежей, а не с KeyValuePair.Просто преобразуйте его в кортежи, прежде чем запускать Series.ofObservations.См. Ниже образец.

open System
open System.Collections.Generic
open Deedle
let pairs = 
  [
    KeyValuePair(DateTime(2018,1,31),1.)
    KeyValuePair(DateTime(2018,2,28),2.)
  ]

pairs
|> Seq.map(fun x -> x.Key, x.Value)
|> Series.ofObservations
...