2016-11-30 1 views
3

Je vous écris un service F # qui utilise Quartz.Net au sondage un autre service (qui a été écrit en C#):Motif correspondant à DateTime.MinValue?

[<PersistJobDataAfterExecution>] 
[<DisallowConcurrentExecution>] 
type PollingJob() = 
    interface IJob with 
     member x.Execute(context: IJobExecutionContext) = 
      let uri = "http://localhost:8089/" 
      let storedDate = context.JobDetail.JobDataMap.GetDateTime("LastPoll") 
      //this works... 
      let effectiveFrom = (if storedDate = DateTime.MinValue then System.Nullable() else System.Nullable(storedDate)) 

      let result = someFunction uri effectiveFrom 

      context.JobDetail.JobDataMap.Put("LastPoll", DateTime.UtcNow) |> ignore 

Le context est passé à la fonction Execute par Quartz pour chaque sondage et contient un dictionnaire. La première fois que le service exécute la valeur LastPoll sera la valeur par défaut DateTime, c'est-à-dire 01/01/0001 00:00:00. Ensuite, la prochaine fois que le planificateur s'exécutera LastPoll contiendra l'heure du dernier sondage.

je peux créer un Nullable<DateTime> en utilisant la if..then..else construction (ci-dessus), mais lorsque je tente d'utiliser ltrage je reçois une erreur de compilation avec un gribouillis sous DateTime.MinValue:

Ce champ n'est pas un littéral et ne peut pas être utilisé dans un modèle

Le code que je suis en train d'utiliser est la suivante:

//this doesn't... 
let effectiveFrom = 
    match storedDate with 
    | DateTime.MinValue -> System.Nullable() 
    | _ -> System.Nullable(storedDate) 

Répondre

3

Vous utilisez un motif légèrement incorrect.

Le ci-dessous devrait fonctionner:

let effectiveFrom = 
     match storedDate with 
     | d when d = DateTime.MinValue -> System.Nullable() 
     | _       -> System.Nullable(storedDate) 

Lorsque vous voulez tester l'égalité dans le cadre d'un match de motif, vous devez utiliser une clause WHEN (voir ici - https://fsharpforfunandprofit.com/posts/match-expression/)

+2

Cela fonctionne parfaitement, merci toi. Et merci pour le lien. –