我有以下F#代码。函数getARow
返回(string * string * string) option
。在main函数中,我需要提取列值并分别将它们分配给a, b, c
。怎么实现呢? (新手问题)
如果没有找到行,该函数可能会返回null?如果getARow
返回null,如何处理它?</ p>
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
答案 0 :(得分: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
如果没有行则返回null
- 这将起作用,因为null
是None
的内部表示。但是你也可以使用an extension that adds headOrNone
来使代码更好。