3

我有以下 F# 代码。函数getARow返回(string * string * string) option。在主函数中,我需要提取列值并将它们a, b, c分别分配给它们。如何实施?(新手问题)

如果没有找到行,该函数可能会返回 null 吗?如果getARow返回null如何处理?

open System
open System.Data
open System.Data.Linq
open Microsoft.FSharp.Data.TypeProviders
open Microsoft.FSharp.Linq
open System.Net
open System.IO
open FSharp.Data

type dbSchema = SqlDataConnection<"Data Source=Svr;Initial Catalog=DB;Integrated Security=SSPI;"> 
//, LocalSchemaFile = "Schema.dbml", ForceUpdate = false > 

let getARow =
    let db = dbSchema.GetDataContext()
    db.DataContext.Log <- System.Console.Out
    let query = query { 
        for row in db.Table1 do 
        where (row.SiteID = 1) 
        select (Some(row.Col1, row.Col2, row.Col2)) // All Colx are strings
        headOrDefault // May return null
        }
    query 

[<EntryPoint>]
let main argv = 
    let aRow = getARow
    printfn "%A" aRow 

    let a,b,c = match aRow with
    | ........ // How to let a = Col1, b = Col2 and c = Col3?
    | None -> failwith "Cannot find a row" // Null?
    0
4

1 回答 1

7

要从选项类型中提取值(无论它包含什么),您需要使用嵌套模式的Some <...>模式<...>,该模式可以为值命名(如果您想要包含元组的单个变量)或进一步分解它(如果你想要三个单独的变量):

let a,b,c = 
  match aRow with
  | Some(a, b, c) -> a, b, c
  | None -> failwith "Cannot find a row"

或者,您可以只使用内置Option.get函数:

let a,b,c = Option.get aRow

您的代码依赖于一个技巧 -如果没有行则headOrDefault返回- 这将起作用,因为. 但是你也可以使用一个扩展来使代码更好一点。nullnullNoneheadOrNone

于 2013-09-20T15:27:30.560 回答