Operatory dopuszczające wartość null (F#)
Operatorzy Nullable są operatory dwuargumentowe arytmetycznej lub porównania, współpracujących z nullable typów arytmetycznych na jednej lub obu stron.Typy Nullable pojawiają się często, podczas pracy z danymi ze źródeł, takich jak bazy danych, które dopuszcza wartość null zamiast wartości rzeczywistych.Operatory Nullable są często stosowane w wyrażeniach kwerend.Oprócz nullable operatory arytmetyczne i porównań operatory konwersji może służyć do konwersji między typami nullable.Istnieją również nullable wersje niektóre operatory kwerendy.
Tabela Nullable operatorów
Poniższa lista zawiera operatory nullable obsługiwane w języku F#.
Nullable po lewej stronie |
Nullable po prawej stronie |
Obie strony nullable |
Uwagi
Operatory nullable znajdują się w NullableOperators modułu w przestrzeni nazw Microsoft.FSharp.Linq.Typ danych Null jest Nullable.
W wyrażeniach kwerend nullable typów powstać przy wybieraniu danych ze źródła danych, że dozwolone są wartości NULL, zamiast wartości.W bazie danych programu SQL Server każda kolumna danych w tabeli ma atrybut, który wskazuje, czy dozwolone są wartości NULL.Jeśli dozwolone są wartości NULL, dane zwrócone z bazy danych może zawierać wartości NULL, które nie może być reprezentowane przez typ danych pierwotnych takich jak int, float, i tak dalej.W związku z tym, dane są zwracane jako System.Nullable<int> zamiast int, i System.Nullable<float> zamiast float.Rzeczywista wartość, można otrzymać od Nullable obiektu za pomocą Value właściwość, a można ustalić, czy Nullable obiektu ma wartość, wywołując HasValue metody.Inną metodą użyteczne jest GetValueOrDefault metodę, która pozwala uzyskać wartość lub wartość domyślną odpowiedniego typu.Wartością domyślną jest pewną formę "zero" wartości, takie jak 0, 0.0, lub false.
Typy null mogą być konwertowane na-nullable typów pierwotnych przy użyciu operatory konwersji zwykłymi, takich jak int lub float.Jest również możliwe do konwersji z jednego typu NULL do innego typu null przy użyciu operatory konwersji dla typów nullable.Operatory konwersji właściwe mają taką samą nazwę jak standardowe skróty, ale są one w module oddzielnych Nullable moduł w Microsoft.FSharp.Linq obszaru nazw.Zazwyczaj możesz otworzyć ten obszar nazw podczas pracy z wyrażenia w kwerendzie.W takim przypadku można używać operatorów nullable konwersji przez dodanie prefiksu Nullable. do odpowiednich konwersji operatora, jak pokazano w poniższym kodzie.
open Microsoft.Fsharp.Linq
let nullableInt = new System.Nullable<int>(10)
// Use the Nullable.float conversion operator to convert from one nullable type to another nullable type.
let nullableFloat = Nullable.float nullableInt
// Use the regular non-nullable float operator to convert to a non-nullable float.
printfn "%f" (float nullableFloat)
Dane wyjściowe są 10.000000.
Kwerendy podmioty gospodarcze na polach nullable danych, takich jak sumByNullable, istnieją również do użycia w wyrażeniach kwerend.Operatory kwerendy dla typów Null nie są typu zgodnych z typami nullable, więc podczas pracy z wartościami null danych, należy użyć wersji nullable operator odpowiednią kwerendę.Aby uzyskać więcej informacji, zobacz Wyrażenia kwerend (F#).
Poniższy przykład pokazano sposób użycia operatorów NULL w wyrażeniu kwerendy F#.Pierwszy kwerenda pokazuje, jak zapisałaby kwerendy bez nullable operatora; drugą kwerendę pokazuje równoważne kwerendy, która używa operatora nullable.Pełen kontekst, włączając sposoby konfigurowania bazy danych, aby użyć przykładowego kodu, zobacz Wskazówki: uzyskiwanie dostępu do bazy danych SQL za pomocą dostawców typów (F#).
open System
open System.Data
open System.Data.Linq
open Microsoft.FSharp.Data.TypeProviders
open Microsoft.FSharp.Linq
[<Generate>]
type dbSchema = SqlDataConnection<"Data Source=MYSERVER\INSTANCE;Initial Catalog=MyDatabase;Integrated Security=SSPI;">
let db = dbSchema.GetDataContext()
query {
for row in db.Table2 do
where (row.TestData1.HasValue && row.TestData1.Value > 2)
select row
}
|> Seq.iter (fun row -> printfn "%d %s" row.TestData1.Value row.Name)
query {
for row in db.Table2 do
// Use a nullable operator ?>
where (row.TestData1 ?> 2)
select row
}
|> Seq.iter (fun row -> printfn "%d %s" (row.TestData1.GetValueOrDefault()) row.Name)