Istruzione letLet statement

Le istruzioni Let associano nomi a espressioni.Let statements bind names to expressions. Per il resto dell'ambito, in cui viene visualizzata l'istruzione Let, il nome può essere usato per fare riferimento al relativo valore associato.For the rest of the scope, where the let statement appears, the name can be used to refer to its bound value. L'istruzione Let può trovarsi all'interno di un ambito globale o di un ambito del corpo di una funzione.The let statement may be within a global scope or a function body scope. Se tale nome è stato precedentemente associato a un altro valore, viene usata l'associazione dell'istruzione Let "più interna".If that name was previously bound to another value, the "innermost" let statement binding is used.

Le istruzioni Let migliorano la modularità e il riutilizzo, poiché consentono di suddividere un'espressione potenzialmente complessa in più parti.Let statements improve modularity and reuse, since they let you break a potentially complex expression into multiple parts. Ogni parte è associata a un nome tramite l'istruzione Let e insieme compone l'intera.Each part is bound to a name through the let statement, and together they compose the whole. Possono inoltre essere utilizzati per creare visualizzazioni e funzioni definite dall'utente.They can also be used to create user-defined functions and views. Le visualizzazioni sono espressioni su tabelle i cui risultati sono simili a una nuova tabella.The views are expressions over tables whose results look like a new table.

Nota

I nomi associati dalle istruzioni Let devono essere nomi di entità validi.Names bound by let statements must be valid entity names.

Le espressioni delimitate dalle istruzioni Let possono essere:Expressions bound by let statements can be:

  • Tipi scalariScalar types
  • Tipi tabulariTabular types
  • Funzioni definite dall'utente (espressioni lambda)User-defined functions (lambdas)

SintassiSyntax

letNome = ScalarExpression | TabularExpression | FunctionDefinitionExpressionlet Name = ScalarExpression | TabularExpression | FunctionDefinitionExpression

CampoField DefinizioneDefinition EsempioExample
NomeName Nome da associare.The name to bind. Il nome deve essere un nome di entità valido.The name must be a valid entity name. Il nome dell'entità di escape, ad esempio ["Name with spaces"] , è consentito.Entity name escaping, such as ["Name with spaces"], is permitted.
ScalarExpressionScalarExpression Espressione con un risultato scalare il cui valore è associato al nome.An expression with a scalar result whose value is bound to the name. let one=1;
TabularExpressionTabularExpression Espressione con un risultato tabulare il cui valore è associato al nome.An expression with a tabular result whose value is bound to the name. Logs | where Timestamp > ago(1h)
FunctionDefinitionExpressionFunctionDefinitionExpression Espressione che restituisce un'espressione lambda, una dichiarazione di funzione anonima da associare al nome.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) }

Sintassi delle espressioni lambdaLambda expressions syntax

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

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

oppure:or:

[TabularArgName : ( * )][TabularArgName : ( * )]

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

CampoField DefinizioneDefinition EsempioExample
visualizzareview Può apparire solo in un'espressione lambda senza parametri, che non ha argomenti.May appear only in a parameterless lambda, that has no arguments. Indica che il nome associato verrà incluso quando "tutte le tabelle" sono query.It indicates that the bound name will be included when "all tables" are queries. Ad esempio, quando si usa union * .For example, when using union *.
TabularArgumentsTabularArguments Elenco di argomenti formali di espressione tabulare.The list of the formal tabular expression arguments.
Ogni argomento tabulare presenta:Each tabular argument has:
  • TabularArgNameTabularArgName
Nome dell'argomento tabulare formale.The name of the formal tabular argument. Il nome può essere visualizzato in FunctionBody ed è associato a un determinato valore quando viene richiamata l'espressione lambda.The name may appear in the FunctionBody and is bound to a particular value when the lambda is invoked.
  • Definizione dello schema della tabellaTable schema definition
Elenco di attributi con i relativi tipiA list of attributes with their types AtrName : AtrTypeAtrName : AtrType
ScalarArgumentsScalarArguments Elenco degli argomenti scalari formali.The list of the formal scalar arguments.
Ogni argomento scalare presenta:Each scalar argument has:
  • ArgNameArgName
Nome dell'argomento scalare formale.The name of the formal scalar argument. Il nome può essere visualizzato in FunctionBody ed è associato a un determinato valore quando viene richiamata l'espressione lambda.The name may appear in the FunctionBody and is bound to a particular value when the lambda is invoked.
  • ArgTypeArgType
Tipo dell'argomento scalare formale.The type of the formal scalar argument. Attualmente solo i tipi seguenti sono supportati come tipo di argomento lambda: bool , string , long , datetime , timespan , e real dynamic (e alias a questi tipi).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).

Nota

L'espressione tabulare utilizzata nella chiamata lambda deve includere (ma non è limitata) tutti gli attributi con i tipi corrispondenti.The tabular expression that is used in the lambda invocation must include (but is not limited to) all the attributes with the matching types.

(*)può essere usato come espressione tabulare.(*) can be used as the tabular expression.

Qualsiasi espressione tabulare può essere utilizzata nella chiamata lambda e nessuna delle colonne può essere accessibile nell'espressione lambda.Any tabular expression can be used in the lambda invocation and none of its columns can be accessed in the lambda expression.

Tutti gli argomenti tabulari devono essere visualizzati prima degli argomenti scalari.All tabular arguments should appear before the scalar arguments.

Più istruzioni Let nidificateMultiple and nested let statements

È possibile utilizzare più istruzioni Let con il punto e virgola, ; , delimitatore tra loro, come nell'esempio seguente.Multiple let statements can be used with the semicolon, ;, delimiter between them, like in the following example.

Nota

L'ultima istruzione deve essere un'espressione di query valida.The last statement must be a valid query expression.

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

Le istruzioni let annidate sono consentite e possono essere usate all'interno di un'espressione lambda.Nested let statements are permitted, and can be used inside a lambda expression. Le istruzioni e gli argomenti Let sono visibili nell'ambito corrente e interno del corpo della funzione.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 | ...

EsempiExamples

Utilizzare let function per definire le costantiUse let function to define constants

Nell'esempio seguente il nome viene associato al x valore letterale scalare 1 e quindi utilizzato in un'istruzione di espressione tabulare.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

Questo esempio è simile a quello precedente, ma solo il nome dell'istruzione Let viene specificato utilizzando la ['name'] nozione.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

USA Let per valori scalariUse 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

Usare l'istruzione Let con argomenti per il calcolo scalareUse let statement with arguments for scalar calculation

In questo esempio viene utilizzata l'istruzione Let con argomenti per il calcolo scalare.This example uses the let statement with arguments for scalar calculation. La query definisce la funzione MultiplyByN per moltiplicare due numeri.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 resultresult
11 55
22 1010
33 1515
44 2020
55 2525

Nell'esempio seguente vengono rimossi dall'input quelli iniziali e finali ( 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 resultresult
1010 00
1111
1212 22
1313 33
1414 44
1515 55

Usare più istruzioni LetUse multiple let statements

Questo esempio definisce due istruzioni Let in cui un'istruzione ( foo2 ) usa un'altra ( 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

Usare la view parola chiave in un'istruzione LetUse the view keyword in a let statement

Questo esempio illustra come usare l'istruzione Let con la view parola chiave.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

Usa funzione materializzaUse materialize function

La materialize funzione consente di memorizzare nella cache i risultati della sottoquery durante l'esecuzione delle query.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
Giorno 1Day1 Giorno 2Day2 PercentualePercentage
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