Операторы, допускающие значение NULL, в запросах
Операторы, допускающие значение NULL, — это двоичные арифметические операторы или операторы сравнения, которые работают с арифметическими типами, допускающими значение NULL, на одной или обеих сторонах. Типы, допускающие значение NULL, возникают при работе с данными из источников, таких как базы данных, разрешающие значения NULL вместо фактических значений. Операторы, допускающие значение NULL, используются в выражениях запросов. Помимо операторов, допускающих значение NULL для арифметики и сравнения, операторы преобразования можно использовать для преобразования между типами, допускающими значение NULL. Существуют также версии, допускающие значение NULL, определенные операторы запросов.
Примечание.
Операторы, допускающие значение NULL, обычно используются только в выражениях запросов. Если вы не используете выражения запросов, вам не нужно знать или использовать эти операторы.
Таблица операторов, допускающих значение NULL
В следующей таблице перечислены операторы, допускающие значение NULL, поддерживаемые в F#.
Значение NULL слева | Значение NULL справа | Обе стороны могут иметь значение NULL |
---|---|---|
?>= | >=? | ?>=? |
?> | >? | ??> |
?<= | <=? | ?<=? |
?< | <? | ??< |
?= | =? | ?=? |
?<> | <>? | ??<> |
?+ | +? | ?+? |
?- | -? | ?-? |
?* | *? | ?*? |
?/ | /? | ?/? |
?% | %? | ?%? |
Замечания
Операторы, допускающие значение NULL, включены в модуль NullableOperators в пространстве имен FSharp.Linq. Тип для данных, допускающих значение NULL, — System.Nullable<'T>
это .
В выражениях запросов при выборе данных из источника данных возникают типы, допускающие значение NULL, а не значения. В базе данных SQL Server каждый столбец данных в таблице имеет атрибут, указывающий, разрешены ли значения NULL. Если допустимы значения NULL, данные, возвращаемые из базы данных, могут содержать значения NULL, которые не могут быть представлены примитивным типом данных, например int
, float
и т. д. Таким образом, данные возвращаются System.Nullable<int>
вместо int
, а System.Nullable<float>
не float
. Фактическое значение можно получить из System.Nullable<'T>
объекта с помощью Value
свойства, и можно определить, имеет ли System.Nullable<'T>
объект значение, вызвав HasValue
метод. Другим полезным методом System.Nullable<'T>.GetValueOrDefault
является метод, который позволяет получить значение или значение по умолчанию соответствующего типа. Значение по умолчанию — это некоторая форма "нулевого" значения, например 0, 0,0 или false
.
Типы, допускающие значение NULL, могут быть преобразованы в непустые примитивные типы, используя обычные операторы преобразования, такие как int
или float
. Кроме того, можно преобразовать один тип, допускающий значение NULL, в другой тип, допускающий значение NULL, с помощью операторов преобразования для типов, допускающих значение NULL. Соответствующие операторы преобразования имеют то же имя, что и стандартные, но они находятся в отдельном модуле, модуле NULL в пространстве имен 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#. Первый запрос показывает, как вы напишете запрос без оператора, допускаемого значение NULL; Второй запрос показывает эквивалентный запрос, использующий оператор NULL. Полный контекст, включая настройку базы данных для использования этого примера кода, см. в пошаговом руководстве. Доступ к База данных SQL с помощью поставщиков типов.
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{row.TestData1.Value} %s{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{row.TestData1.GetValueOrDefault()} %s{row.Name}")