Поделиться через


Свойство System.Data.DataColumn.Expression

В этой статье приводятся дополнительные замечания к справочной документации по этому API.

Одно из применений свойства Expression — это создание вычисляемых столбцов. Например, для вычисления налоговой стоимости цена единицы умножается на ставку налога определенного региона. Поскольку налоговые ставки варьируются от региона к региону, было бы невозможно поместить единую налоговую ставку в столбец; Вместо этого значение вычисляется с помощью Expression свойства, как показано в следующем коде:

DataSet1.Tables("Products").Columns("tax").Expression = "UnitPrice * 0.086"

Второе применение заключается в создании агрегатного столбца. Подобно вычисляемому значению, агрегат выполняет операцию на основании полного набора строк в объекте DataTable. Простой пример — подсчет количества строк, возвращаемых в наборе. Это метод, используемый для подсчета количества транзакций, выполненных определенным продавцом, как показано в следующем коде:

DataSet1.Tables("Orders").Columns("OrderCount").Expression = "Count(OrderID)"

Синтаксис выражений

При создании выражения используйте ColumnName свойство для ссылки на столбцы. Например, если для одного столбца ColumnName задано значение UnitPrice и другое "Quantity", то выражение:

"UnitPrice * Quantity"

Замечание

Если столбец используется в выражении, то выражение, как говорят, имеет зависимость от этого столбца. Если зависимый столбец переименован или удален, исключение не возникает. Исключение будет выброшено при доступе к сломанному столбцу выражения.

При создании выражения для фильтра заключайте строки с одними кавычками:

"LastName = 'Jones'"

Если имя столбца содержит несколько небуквенно-цифровых символов, начинается с цифры или совпадает по значению (без учета регистра) с одним из следующих зарезервированных слов, ему требуется специальная обработка, как описано в следующих абзацах.

And

Between

Child

False

In

Is

Like

Not

Null

Or

Parent

True

Если имя столбца соответствует одному из предыдущих условий, оно должно быть заключено в квадратные скобки или кавычки "'" (серьезный акцент). Например, чтобы использовать столбец "Column#" в выражении, необходимо написать "[Столбец#]" или "Column#":

Total * [Column#]

Если имя столбца заключено в квадратные скобки, то символы ']' и '\' в нем должны быть экранированы, добавляя перед ними обратную косую черту '\', тогда как другие символы этого не требуют. Если имя столбца заключено в серьезные символы акцента, оно не должно содержать каких-либо серьезных символов акцента. Например, столбец с именем "Column[]\" будет записан следующим образом:

Total * [Column[\]\\]

или

Всего * `Column[]\`

Определяемые пользователем значения

Определяемые пользователем значения могут использоваться в выражениях для сравнения со значениями столбцов. Строковые значения должны быть заключены в одинарные апострофы (и каждый одиночный символ апострофа в строковом значении должен быть экранирован путем добавления перед ним другого одиночного символа апострофа). Значения даты должны быть заключены в знаки фунта (#) или одинарные кавычки (') на основе поставщика данных. Десятичные и научные нотации допустимы для числовых значений. Рассмотрим пример.

"FirstName = 'John'"

"Price <= 50.00"

"Birthdate < #1/31/2006#"

Для столбцов, содержащих значения перечисления, преобразуйте значение к целочисленному типу данных. Рассмотрим пример.

"EnumColumn = 5"

Анализ литеральных выражений

Все литеральные выражения должны быть выражены в инвариантном культурном формате. При разборе и преобразовании литеральных выражений DataSet всегда используется инвариантная культура, а не текущая культура.

Строковые литералы определяются при наличии одинарных кавычек, окружающих значение. Например: 'John'.

Boolean литералы являются true и false; они не цитируются в выражениях.

Integer литералы [+-]? [0-9]+ рассматриваются как System.Int32, System.Int64или System.Double. System.Double может потерять точность в зависимости от величины числа. Например, если число в литерале 2147483650, DataSet сначала попытается проанализировать значение числа как Int32. Это не удастся, так как число слишком большое. В этом случае DataSet анализирует число как Int64, и это будет успешным. Если числовой литерал больше максимального значения Int64, DataSet анализирует этот литерал с помощью Double.

Реальные литералы, использующие научные нотации, такие как 4.42372E-30, анализируются с помощью System.Double.

Реальные литералы без научной нотации, но с десятичной запятой рассматриваются как System.Decimal. Если число превышает максимальное или минимальное значение, поддерживаемоеSystem.Decimal, то он анализируется как .System.Double Рассмотрим пример.

  • 142526.144524 преобразуется в Decimal.
  • 345262.78036719560925667 рассматривается как Double.

Операторы

Объединение допускается с помощью логических операторов AND, OR и NOT. Круглые скобки можно использовать для группирования предложений и принудительного приоритета. Оператор AND имеет приоритет над другими операторами. Рассмотрим пример.

(LastName = 'Smith' OR LastName = 'Jones') AND FirstName = 'John'

При создании выражений сравнения разрешены следующие операторы:

  • <
  • >
  • <=
  • >=
  • =
  • IN
  • LIKE

Следующие арифметические операторы также поддерживаются в выражениях:

  • + (добавление)
  • - (вычитание)
  • * (умножение)
  • / (деление)
  • % (модуль)

Строковые операторы

Чтобы объединить строку, используйте + символ. Значение CaseSensitive свойства DataSet класса определяет, является ли сравнение строк чувствительным к регистру. Однако можно переопределить это значение свойством CaseSensitiveDataTable класса.

Подстановочные знаки

Символы * и % можно использовать взаимозаменяемо в качестве подстановочных знаков в сравнении LIKE. Если строка в предложении LIKE содержит символы * или %, эти символы должны быть заключены в квадратные скобки ([]). Если скобка находится в предложении, каждый символ скобки должен быть заключен в квадратные скобки (например [[] , или []]). Подстановочный знак допускается в начале и конце шаблона или в конце шаблона или в начале шаблона. Рассмотрим пример.

  • "ItemName LIKE '*product*'"
  • "ItemName LIKE '*product'"
  • "ItemName LIKE 'product*'"

Подстановочные знаки не допускаются в середине строки. Например, 'te*xt' запрещено.

Ссылка на связь "родитель-потомок"

В выражении к родительской таблице можно обратиться, добавив к имени столбца Parent в начале. Например, Parent.Price ссылается на столбец родительской таблицы с именем Price.

При наличии у ребёнка нескольких родительских строк, используйте Parent(RelationName).ColumnName. Например, Parent(RelationName).Price ссылается на столбец родительской таблицы с именем Price через отношение.

Столбец в дочерней таблице может использоваться в выражении путем добавления перед именем столбца Child. Однако, поскольку дочерние связи могут возвращать несколько строк, необходимо включить ссылку на дочерний столбец в агрегатной функции. Например, Sum(Child.Price) будет возвращена сумма столбца, именованного Price в дочерней таблице.

Если таблица имеет несколько дочерних элементов, синтаксис имеет следующий формат: Child(RelationName) Например, если в таблице есть две дочерние таблицы с именем Customers и Orders, и объект DataRelation называется Customers2Orders, ссылка будет следующим образом:

Avg(Child(Customers2Orders).Quantity)

Агрегаты

Поддерживаются следующие агрегатные типы:

  • Sum (Сумма)
  • Avg (Среднее)
  • Min (минимум)
  • Max (максимум)
  • Count (Число)
  • StDev (Статистическое стандартное отклонение)
  • Var (Статистические дисперсии)

Агрегаты обычно выполняются по связям. Создайте агрегатное выражение с помощью одной из функций, перечисленных ранее, и столбца дочерней таблицы, как описано в ссылке на отношение "Родитель/дочерний". Рассмотрим пример.

  • Avg(Child.Price)
  • Avg(Child(Orders2Details).Price)

Агрегирование также можно выполнить в одной таблице. Например, чтобы создать сводку цифр в столбце с именем Price:

Sum(Price)

Замечание

Если вы используете одну таблицу для создания агрегата, функции группирования не будут. Вместо этого все строки будут отображать одно и то же значение в столбце.

Если в таблице нет строк, агрегатные функции возвращаются null.

Типы данных всегда можно определить, проверив DataType свойство столбца. Вы также можете преобразовать типы данных с помощью функции, показанной Convert в следующем разделе.

Агрегат может применяться только к одному столбцу, а другие выражения не могут использоваться внутри агрегата.

Функции

Также поддерживаются следующие функции.

CONVERT

Эта функция преобразует выражение в указанный тип .NET.

Convert(expression, type)
Аргумент Описание
expression Выражение для преобразования.
type Тип .NET, в который будет преобразовано значение.

Пример: myDataColumn.Expression="Convert(total, 'System.Int32')"

Все преобразования допустимы со следующими исключениями: Boolean можно преобразовать только в Byte, SByte, Int16, Int32, Int64, UInt16, UInt32, UInt64, String и обратно. Char может быть преобразован в и из Int32, UInt32, String и только в самого себя. DateTime может быть принучен только к и от String себя. TimeSpan может быть принучен только к и от String себя.

LEN

Эта функция получает длину строки.

LEN(expression)
Аргументы Описание
expression Вычисляемая строка.

Пример: myDataColumn.Expression="Len(ItemName)"

ISNULL

Эта функция проверяет выражение и возвращает проверенное выражение или значение замены.

ISNULL(expression, replacementvalue)
Аргументы Описание
expression Выражение для проверки.
replacementvalue Если выражение равно null, replacementvalue возвращается.

Пример: myDataColumn.Expression="IsNull(price, -1)"

IIF

Эта функция получает одно из двух значений в зависимости от результата логического выражения.

IIF(expr, truepart, falsepart)
Аргументы Описание
expr Выражение для вычисления.
truepart Значение, возвращаемое, если выражение имеет значение true.
falsepart Значение, возвращаемое, если выражение ложно.

Пример: myDataColumn.Expression = "IIF(total>1000, 'expensive', 'dear')

TRIM

Эта функция удаляет все начальные и конечные пустые символы, такие как \r, \n, \t и '.

TRIM(expression)
Аргумент Описание
expression Выражение для обрезания.

SUBSTRING

Эта функция получает подстроку указанной длины, начиная с указанной точки в строке.

SUBSTRING(expression, start, length)
Аргумент Описание
expression Исходная строка для подстроки
start Целое число, указывающее, где начинается подстрока.
length Целое число, указывающее длину подстроки.

Пример: myDataColumn.Expression = "SUBSTRING(phone, 7, 8)"

Замечание

Можно сбросить Expression свойство, назначив ему значение NULL или пустую строку. Если для столбца выражения задано значение по умолчанию, то после сброса свойства Expression все ранее заполненные строки назначаются этим значением.