Compartilhar via


Propriedade System.Data.DataColumn.Expression

Este artigo fornece comentários complementares à documentação de referência para esta API.

Um uso da Expression propriedade é criar colunas calculadas. Por exemplo, para calcular um valor de imposto, o preço unitário é multiplicado por uma taxa de imposto de uma região específica. Como as taxas de imposto variam de região para região, seria impossível colocar uma única taxa de imposto em uma coluna; em vez disso, o valor é calculado usando a Expression propriedade, conforme mostrado no seguinte código:

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

Um segundo uso é criar uma coluna de agregação. Semelhante a um valor calculado, uma agregação executa uma operação com base no conjunto completo de linhas no DataTable. Um exemplo simples é contar o número de linhas retornadas no conjunto. Esse é o método que você usaria para contar o número de transações concluídas por um vendedor específico, conforme mostrado no código a seguir:

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

Sintaxe de expressão

Ao criar uma expressão, use a ColumnName propriedade para se referir às colunas. Por exemplo, se a ColumnName de uma coluna for "UnitPrice" e o de outra coluna for "Quantity", a expressão será:

"UnitPrice * Quantity"

Observação

Se uma coluna é usada em uma expressão, diz-se que a expressão tem uma dependência nessa coluna. Se uma coluna dependente for renomeada ou removida, nenhuma exceção será gerada. Uma exceção será gerada quando a coluna de expressão agora interrompida for acessada.

Ao criar uma expressão para um filtro, coloque cadeias de caracteres com aspas simples:

"LastName = 'Jones'"

Se um nome de coluna contiver caracteres não alfanuméricos, começar com um dígito ou corresponder (sem diferenciar maiúsculas de minúsculas) de qualquer uma das palavras reservadas a seguir, ele exigirá um tratamento especial, conforme descrito nos parágrafos a seguir.

And

Between

Child

False

In

Is

Like

Not

Null

Or

Parent

True

Se um nome de coluna atender a uma das condições anteriores, ele deverá ser encapsulado em colchetes ou aspas "`" (acento grave). Por exemplo, para usar uma coluna chamada "Column#" em uma expressão, você escreveria "[Column#]" ou "'Column#'":

Total * [Column#]

Se o nome da coluna estiver entre colchetes, todos os caracteres ']' e '\' (mas não qualquer outro caractere) nele deverão ser escapados, prefixando-os com o caractere de barra invertida ("\"). Se o nome da coluna estiver entre caracteres de acento grave, ele não deverá conter caracteres de acento grave. Por exemplo, uma coluna chamada "Column[]\" seria escrita:

Total * [Column[\]\\]

ou

Total * `Coluna[]\`

Valores definidos pelo usuário

Os valores definidos pelo usuário podem ser usados em expressões a serem comparados com valores de coluna. Os valores de cadeia de caracteres devem ser colocados entre aspas simples (e cada caractere de aspas simples em um valor de string precisa ser escapado, prefixado com outro caractere de aspas simples). Os valores de data devem ser colocados entre cerquilhas (#) ou aspas simples (') com base no provedor de dados. Decimais e notação científica são permitidos para valores numéricos. Por exemplo:

"FirstName = 'John'"

"Price <= 50.00"

"Birthdate < #1/31/2006#"

Para colunas que contêm valores de enumeração, converta o valor em um tipo de dados inteiro. Por exemplo:

"EnumColumn = 5"

Analisar expressões literais

Todas as expressões literais devem ser expressas na localidade de cultura invariável. Quando DataSet analisa e converte expressões literais, ele sempre usa a cultura invariável, não a cultura atual.

Literais de cadeia de caracteres são identificados quando há aspas únicas ao redor do valor. Por exemplo, 'John'.

Boolean literais são true e false; eles não são citados em expressões.

Integer literais [+-]?[0-9]+ são tratados como System.Int32, System.Int64 ou System.Double. System.Double pode perder a precisão dependendo do tamanho do número. Por exemplo, se o número no literal for 2147483650, o DataSet tentará primeiro interpretar o número como um Int32. Isso não terá êxito porque o número é muito grande. Nesse caso DataSet, analisa o número como um Int64, que terá êxito. Se o literal for um número maior que o valor máximo de um Int64, DataSet analisará o literal usando Double.

Literais reais que utilizam notação científica, como 4.42372E-30, são interpretados utilizando System.Double.

Literais reais sem notação científica, mas com um ponto decimal, são tratados como System.Decimal. Se o número exceder os valores máximos ou mínimos suportados por System.Decimal, ele será interpretado como um System.Double. Por exemplo:

  • 142526.144524 é convertido em um Decimal.
  • 345262.78036719560925667 é tratado como um Double.

Operadores

A concatenação é permitida usando operadores BOOLEAN AND, OR e NOT. Você pode usar parênteses para agrupar cláusulas e forçar precedência. O operador AND tem precedência sobre outros operadores. Por exemplo:

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

Quando você cria expressões de comparação, os seguintes operadores são permitidos:

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

Os seguintes operadores aritméticos também têm suporte em expressões:

  • + (adição)
  • - (subtração)
  • * (multiplicação)
  • / (divisão)
  • % (módulo)

Operadores de cadeia de caracteres

Para concatenar uma cadeia de caracteres, use o + caractere. O valor da propriedade CaseSensitive da classe DataSet determina se as comparações de cadeias de caracteres diferenciam maiúsculas de minúsculas. No entanto, você pode substituir esse valor com a CaseSensitive propriedade da DataTable classe.

Caracteres curinga

Tanto os caracteres * quanto os caracteres % podem ser usados de forma intercambiável para caracteres curinga em uma comparação LIKE. Se a cadeia de caracteres em uma cláusula LIKE contiver um * ou %, esses caracteres deverão ser colocados entre colchetes ([]). Se um colchete estiver na cláusula, cada caractere de colchete deverá ser colocado entre colchetes (por exemplo [[] ou []]). Um curinga é permitido no início e no final de um padrão, ou no final de um padrão ou no início de um padrão. Por exemplo:

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

Caracteres curinga não são permitidos no meio de uma cadeia de caracteres. Por exemplo, 'te*xt' não é permitido.

Referência da relação pai/filho

Uma tabela pai pode ser referenciada em uma expressão antepondo Parent ao nome da coluna. Por exemplo, Parent.Price faz referência à coluna da tabela pai chamada Price.

Quando um filho tiver mais de uma linha pai, use Parent(RelationName).ColumnName. Por exemplo, Parent(RelationName).Price referencia a coluna da tabela pai chamada "Preço" por meio da relação estabelecida.

Uma coluna em uma tabela filha pode ser referenciada em uma expressão ao prefixar o nome da coluna com Child. Porém, como as relações filho podem retornar várias linhas, é necessário incluir a referência à coluna filho em uma função de agregação. Por exemplo, Sum(Child.Price) retornaria a soma da coluna chamada Price na tabela filha.

Se uma tabela tiver mais de um filho, a sintaxe será: Child(RelationName). Por exemplo, se uma tabela tiver duas tabelas filho nomeadas Customers e Orders, e o DataRelation objeto for nomeado Customers2Orders, a referência será a seguinte:

Avg(Child(Customers2Orders).Quantity)

Agregações

Há suporte para os seguintes tipos de agregação:

  • Sum (Soma)
  • Avg (Média)
  • Min (Mínimo)
  • Max (Máximo)
  • Count (Contagem)
  • StDev (Desvio padrão estatístico)
  • Var (Variação estatística)

As agregações são normalmente executadas ao longo das relações. Crie uma expressão de agregação usando uma das funções listadas anteriormente e uma coluna de tabela filho, conforme detalhado na referência de relação pai/filho. Por exemplo:

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

Uma agregação também pode ser executada em uma única tabela. Por exemplo, para criar um resumo de figuras em uma coluna chamada "Preço":

Sum(Price)

Observação

Se você usar uma única tabela para criar uma agregação, não haverá funcionalidade de agrupamento. Em vez disso, todas as linhas exibiriam o mesmo valor na coluna.

Se uma tabela não tiver linhas, as funções de agregação retornarão null.

Os tipos de dados sempre podem ser determinados examinando a DataType propriedade de uma coluna. Você também pode converter tipos de dados usando a Convert função, mostrada na seção a seguir.

Uma agregação só pode ser aplicada a uma única coluna e nenhuma outra expressão pode ser usada dentro da agregação.

Funções

As funções a seguir também têm suporte.

CONVERT

Essa função converte uma expressão em um tipo .NET especificado.

Convert(expression, type)
Argumento Descrição
expression A expressão a ser convertida.
type Tipo .NET no qual o valor será convertido.

Exemplo: myDataColumn.Expression="Convert(total, 'System.Int32')"

Todas as conversões são válidas com as seguintes exceções: Boolean pode ser coagida bilateralmente de Byte, SByte, Int16, Int32, Int64, UInt16, UInt32, UInt64, String e apenas para si mesma. Char pode ser coagido bilateralmente de Int32, UInt32, String e apenas para si mesmo. DateTime pode ser coagido bilateralmente de String e apenas para si mesmo. TimeSpan pode ser coagido bilateralmente de String e apenas para si mesmo.

LEN

Essa função obtém o comprimento de uma cadeia de caracteres.

LEN(expression)
Argumentos Descrição
expression A cadeia de caracteres a ser avaliada.

Exemplo: myDataColumn.Expression="Len(ItemName)"

ISNULL

Essa função verifica uma expressão e retorna a expressão marcada ou um valor de substituição.

ISNULL(expression, replacementvalue)
Argumentos Descrição
expression A expressão a ser verificada.
replacementvalue Se a expressão for null, replacementvalue será retornada.

Exemplo: myDataColumn.Expression="IsNull(price, -1)"

IIF

Essa função obtém um dos dois valores, dependendo do resultado de uma expressão lógica.

IIF(expr, truepart, falsepart)
Argumentos Descrição
expr A expressão a ser avaliada.
truepart O valor a ser retornado se a expressão for verdadeira.
falsepart O valor a ser retornado se a expressão for falsa.

Exemplo: myDataColumn.Expression = "IIF(total>1000, 'expensive', 'dear')

TRIM

Essa função remove todos os caracteres em branco no início e no fim, como \r, \n, \t e ' '.

TRIM(expression)
Argumento Descrição
expression A expressão a ser cortada.

SUBSTRING

Essa função obtém uma subcadeia de caracteres de um comprimento especificado, começando em um ponto especificado na cadeia de caracteres.

SUBSTRING(expression, start, length)
Argumento Descrição
expression A string de origem para a substring
start Inteiro que especifica onde a subcadeia de caracteres é iniciada.
length Inteiro que especifica o comprimento da subcadeia de caracteres.

Exemplo: myDataColumn.Expression = "SUBSTRING(phone, 7, 8)"

Observação

Você pode redefinir a Expression propriedade atribuindo-lhe um valor nulo ou uma cadeia de caracteres vazia. Se um valor padrão for definido na coluna de expressão, todas as linhas preenchidas anteriormente receberão o valor padrão após a redefinição da Expression propriedade.