Инструкция letLet statement

Операторы let выполняют привязку имен к выражениям.Let statements bind names to expressions. До конца области, в которой появляется оператор let, имя может использоваться для создания ссылки на его связанное значение.For the rest of the scope, where the let statement appears, the name can be used to refer to its bound value. Оператор let можно указать в глобальной области или области тела функции.The let statement may be within a global scope or a function body scope. Если такое имя ранее было привязано к другому значению, используется привязка innermost оператора let.If that name was previously bound to another value, the "innermost" let statement binding is used.

Операторы let повышают модульность и расширяют возможности повторного использования, так как позволяют разбивать потенциально сложное выражение на несколько частей.Let statements improve modularity and reuse, since they let you break a potentially complex expression into multiple parts. Каждая часть привязывается к имени с помощью оператора let, и вместе они составляют цельный объект.Each part is bound to a name through the let statement, and together they compose the whole. Они также могут использоваться для создания определяемых пользователем функций и представлений.They can also be used to create user-defined functions and views. Представления являются выражениями по таблицам, результаты которых выглядят как новая таблица.The views are expressions over tables whose results look like a new table.

Примечание

Имена, связываемые операторами let, должны быть допустимыми именами сущностей.Names bound by let statements must be valid entity names.

Выражения, связываемые операторами let, могут иметь следующий тип:Expressions bound by let statements can be:

  • Скалярные типыScalar types
  • табличные типы;Tabular types
  • определяемые пользователем функции (лямбда-функции).User-defined functions (lambdas)

СинтаксисSyntax

let Name = ScalarExpression | TabularExpression | FunctionDefinitionExpressionlet Name = ScalarExpression | TabularExpression | FunctionDefinitionExpression

ПолеField ОпределениеDefinition ПримерExample
имя;Name Привязываемое имя.The name to bind. Имя должно быть допустимым именем сущности.The name must be a valid entity name. Допускается экранирование имен сущностей, например ["Name with spaces"].Entity name escaping, such as ["Name with spaces"], is permitted.
ScalarExpressionScalarExpression Выражение со скалярным результатом, значение которого привязывается к имени.An expression with a scalar result whose value is bound to the name. let one=1;
TabularExpressionTabularExpression Выражение с табличным результатом, значение которого привязывается к имени.An expression with a tabular result whose value is bound to the name. Logs | where Timestamp > ago(1h)
FunctionDefinitionExpressionFunctionDefinitionExpression Выражение, результатом которого является лямбда-функция — анонимное объявление функции, которое привязывается к имени.An expression that yields a lambda, an anonymous function declaration that is to be bound to the name. let f=(a:int, b:string) { strcat(b, ":", a) }

Синтаксис лямбда-выраженийLambda expressions syntax

[view] ([TabularArguments][,][ScalarArguments]) { FunctionBody }[view] ([TabularArguments][,][ScalarArguments]) { FunctionBody }

TabularArguments - [TabularArgName : ([AtrName : AtrType] [, ... ])] [, ... ][,]TabularArguments - [TabularArgName : ([AtrName : AtrType] [, ... ])] [, ... ][,]

илиor:

[TabularArgName : ( * )] — указывает на табличные выражения с переменными и неизвестными столбцами.[TabularArgName : ( * )] - indicating tabular expressions with variable and unknown columns.

ScalarArguments - [ArgName : ArgType] [, ... ]ScalarArguments - [ArgName : ArgType] [, ... ]

ПолеField ОпределениеDefinition ПримерExample
viewview Может использоваться только в инструкции let без параметров, не имеющей аргументов.May appear only in a parameterless let statement that has no arguments. Если используется ключевое слово View, инструкция let будет включена в запросы, в которых используется оператор union с выбором подстановочных знаков для таблиц и представлений.When the 'view' keyword is used, the let statement will be included in queries that use a union operator with wildcard selection of the tables/views.
*TabularArguments _*TabularArguments _ Список аргументов формального табличного выражения.The list of the formal tabular expression arguments.
Каждый табличный аргумент включает следующее:Each tabular argument has:
  • _TabularArgName*_TabularArgName*
Имя формального табличного аргумента.The name of the formal tabular argument. Это имя может использоваться в FunctionBody. Оно привязано к определенному значению при вызове лямбда-функции.The name may appear in the FunctionBody and is bound to a particular value when the lambda is invoked.
  • Определение схемы таблицыTable schema definition
Список атрибутов с их типамиA list of attributes with their types AtrName : AtrTypeAtrName : AtrType
*ScalarArguments _*ScalarArguments _ Список формальных скалярных аргументов.The list of the formal scalar arguments.
Каждый скалярный аргумент включает следующее:Each scalar argument has:
  • _ArgName*_ArgName*
Имя формального скалярного аргумента.The name of the formal scalar argument. Это имя может использоваться в FunctionBody. Оно привязано к определенному значению при вызове лямбда-функции.The name may appear in the FunctionBody and is bound to a particular value when the lambda is invoked.
  • ArgTypeArgType
Тип формального скалярного аргумента.The type of the formal scalar argument. Сейчас в качестве типов аргументов лямбда-функций поддерживаются только следующие типы: bool, string, long, datetime, timespan, real и dynamic (и псевдонимы для этих типов).Currently only the following types are supported as a lambda argument type: bool, string, long, datetime, timespan, real, and dynamic (and aliases to these types).

Примечание

Табличное выражение, используемое в вызове лямбда-функции, должно включать (среди прочего) все атрибуты с соответствующими типами.The tabular expression that is used in the lambda invocation must include (but is not limited to) all the attributes with the matching types.

(*) можно использовать в качестве табличного выражения.(*) can be used as the tabular expression.

В вызове лямбда-функции можно использовать любое табличное выражение, и ни один из его столбцов не может быть получен в лямбда-выражении.Any tabular expression can be used in the lambda invocation and none of its columns can be accessed in the lambda expression.

Все табличные аргументы должны располагаться перед скалярными аргументами.All tabular arguments should appear before the scalar arguments.

Множественные и вложенные операторы letMultiple and nested let statements

Вы можете использовать несколько операторов let, разделив их точкой с запятой (;), как показано в примере ниже.Multiple let statements can be used with the semicolon, ;, delimiter between them, like in the following example.

Примечание

Последний оператор должен быть допустимым выражением запроса.The last statement must be a valid query expression.

let start = ago(5h); 
let period = 2h; 
T | where Time > start and Time < start + period | ...

Кроме того, разрешены вложенные операторы let, которые можно использовать в лямбда-выражении.Nested let statements are permitted, and can be used inside a lambda expression. Операторы let и их аргументы доступны в текущей и внутренней областях тела функции.Let statements and arguments are visible in the current and inner scope of the function body.

let start_time = ago(5h); 
let end_time = start_time + 2h; 
T | where Time > start_time and Time < end_time | ...

ПримерыExamples

Использование функции let для определения константUse let function to define constants

В следующем примере имя x привязывается к скалярному литералу 1, а затем используется в операторе табличного выражения.The following example binds the name x to the scalar literal 1, and then uses it in a tabular expression statement.

let x = 1;
range y from x to x step x

Этот пример эквивалентен предыдущему, только имя оператора let указывается с помощью понятия ['name'].This example is similar to the previous one, only the name of the let statement is given using the ['name'] notion.

let ['x'] = 1;
range y from x to x step x

Использование let для скалярных значенийUse let for scalar values

let n = 10;  // number
let place = "Dallas";  // string
let cutoff = ago(62d); // datetime
Events 
| where timestamp > cutoff 
    and city == place 
| take n

Использование оператора let с аргументами для скалярного вычисленияUse let statement with arguments for scalar calculation

В этом примере используется оператор let с аргументами для скалярного вычисления.This example uses the let statement with arguments for scalar calculation. Запрос определяет функцию MultiplyByN для умножения двух чисел.The query defines function MultiplyByN for multiplying two numbers.

let MultiplyByN = (val:long, n:long) { val * n };
range x from 1 to 5 step 1 
| extend result = MultiplyByN(x, 5)
xx набор поresult
11 55
22 1010
33 1515
44 2020
55 2525

В следующем примере из входных данных удаляются начальные и конечные символы 1.The following example removes leading/trailing ones (1) from the input.

let TrimOnes = (s:string) { trim("1", s) };
range x from 10 to 15 step 1 
| extend result = TrimOnes(tostring(x))
xx набор поresult
1010 00
1111
1212 22
1313 33
1414 44
1515 55

Использование множественных операторов letUse multiple let statements

В этом примере определяются два оператора let, при этом один оператор (foo2) использует другой (foo1).This example defines two let statements where one statement (foo2) uses another (foo1).

let foo1 = (_start:long, _end:long, _step:long) { range x from _start to _end step _step};
let foo2 = (_step:long) { foo1(1, 100, _step)};
foo2(2) | count
// Result: 50

Использование ключевого слова view в операторе letUse the view keyword in a let statement

В этом примере показано, как использовать оператор let с ключевым словом view.This example shows you how to use let statement with the view keyword.

let Range10 = view () { range MyColumn from 1 to 10 step 1 };
let Range20 = view () { range MyColumn from 1 to 20 step 1 };
search MyColumn == 5
$table$table MyColumnMyColumn
Range10Range10 55
Range20Range20 55

Использование функции materializeUse materialize function

Функция materialize позволяет кэшировать результаты вложенных запросов во время выполнения запроса.The materialize function lets you cache subquery results during the time of query execution.

let totalPagesPerDay = PageViews
| summarize by Page, Day = startofday(Timestamp)
| summarize count() by Day;
let materializedScope = PageViews
| summarize by Page, Day = startofday(Timestamp);
let cachedResult = materialize(materializedScope);
cachedResult
| project Page, Day1 = Day
| join kind = inner
(
    cachedResult
    | project Page, Day2 = Day
)
on Page
| where Day2 > Day1
| summarize count() by Day1, Day2
| join kind = inner
    totalPagesPerDay
on $left.Day1 == $right.Day
| project Day1, Day2, Percentage = count_*100.0/count_1
День 1Day1 День 2Day2 ПроцентPercentage
2016-05-01 00:00:00.00000002016-05-01 00:00:00.0000000 2016-05-02 00:00:00.00000002016-05-02 00:00:00.0000000 34.064572597525534.0645725975255
2016-05-01 00:00:00.00000002016-05-01 00:00:00.0000000 2016-05-03 00:00:00.00000002016-05-03 00:00:00.0000000 16.61836896010116.618368960101
2016-05-02 00:00:00.00000002016-05-02 00:00:00.0000000 2016-05-03 00:00:00.00000002016-05-03 00:00:00.0000000 14.629137648963614.6291376489636