Операторы, допускающие значение NULL (F#)
Арифметические операторы Nullable бинарная или операторы сравнения, арифметическими работают с типами, допускающее значение null для одной или обеих сторон.Тип, допускающий значение null часто возникающие при работе с данными из источников, таких как базы данных, допускающих значения null вместо действительных значений.Операторы Null часто используются в выражениях запроса.В дополнение к операторам, допускающий значение null для сравнения, арифметические и операторы преобразования может использоваться для преобразования между тип, допускающий значение null.Версии одного операторов запросов также допускает значение null.
Таблица операторов Nullable
В следующей таблице перечислены операторы, поддерживаемые в языке F#, допускающее значение null.
Nullable на влево |
Nullable справа |
Обе стороны nullable |
Заметки
Операторы включены в nullable NullableOperators модуль в пространстве имен Microsoft.FSharp.Linq.Тип данных, допускающий значения null Nullable<T>.
В выражениях запроса, тип, допускающий значение null возникают при выборе данных из источника данных, допускающий значения null вместо значений.В базе данных SQL Server, каждый столбец в таблице имеет атрибут, который указывает, допускаются ли значения null.Если разрешены null, то данные, возвращаемые из базы данных может содержать значения null, которые не могут быть представлены как типом-примитивом int" floatи т дСледовательно, данные возвращаются как a System.Nullable<int> вместо intи System.Nullable<float> вместо float.Фактическое значение можно получить из a Nullable<T> объект с помощью Value свойство, и можно определить, a Nullable<T> объект имеет значение путем вызова HasValue метод.Другим полезным метод GetValueOrDefault метод, который позволяет получать значение или значение по умолчанию соответствующего типа.По умолчанию форма "ноль" определенное значение, например 0, 0,0 или false.
Тип, допускающий значение null, не допускающие значения null, могут быть преобразованы в тип-примитивам с помощью обычных операторов преобразования int OR float.Также возможно преобразования одного типа, допускающего значение null в другой тип, допускающий значение null с помощью операторов преобразования в тип, допускающий значение null.Соответствующие операторы преобразования имеют одно и то же имя, как и стандартные один, но их в отдельном модуля Nullable модуль в Microsoft.FSharp.Linq пространство имен.Обычно открытии этого пространства имен при работе с выражениями запроса.В этом случае можно использовать операторы преобразования значения null, добавляя префикс Nullable. в соответствующий оператор преобразования, как показано в следующем коде.
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)
В результате получается 10.000000.
Операторы запросов на полях данных, допускающих значение null sumByNullableтакже существуйте для использования в выражениях запросов.Операторы запросов для типов, не допускающие значения null не является тип-совместимого с тип, допускающий значение null, поэтому необходимо использовать версию соответствующего оператора запроса, допускающее значения null при работе со значениями null.Дополнительные сведения см. в разделе Выражения запросов (F#).
В следующем примере показано использование операторов в выражении запроса F#, допускающее значение null.Первый запрос показывает, как следует написать запрос без оператора, допускающее значение null. второй запрос показывает эквивалентный запрос, использующий оператор, допускающее значение null.Полный контекста, включая способ настройки базы данных для использования этого образца кода см. Пошаговое руководство. Доступ к базе данных SQL с помощью поставщиков типов (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)