Förstå Power Query M-funktioner

I formelspråket Power Query M är en funktion en mappning från en uppsättning indatavärden till ett enda utdatavärde. En funktion skrivs genom att först namnge funktionsparametrarna och sedan ange ett uttryck som beräknar resultatet av funktionen. Funktionstexten kommer efter likhetstecknet (=>). Du kan även ange information som ska inkluderas i parametrar och i funktionens returvärde. En funktion definieras och anropas i texten för en let-instruktion. Parametrar och/eller returvärden kan vara implicita eller explicita. Implicita parametrar och/eller returvärden är av typen any. Att skriva any liknar en objekttyp på andra språk. Alla typer i M härleds från typen any.

En funktion är ett värde precis som ett tal eller ett textvärde och kan inkluderas på raden på samma sätt som andra uttryck. I följande exempel visas en funktion som är värdet för variabeln Lägg till som sedan anropas, eller körs, från flera andra variabler. När en funktion anropas, anges en uppsättning värden som är logiskt ersatta med den obligatoriska uppsättningen indatavärden i uttrycket för funktionstexten.

Exempel – Explicita parametrar och returvärden

let  
    AddOne = (x as number) as number => x + 1,  
    //additional expression steps  
    CalcAddOne = AddOne(5)  
in  
    CalcAddOne  

Exempel – Implicita parametrar och returvärden

let  
    Add = (x, y) => x + y,  
    AddResults =   
        [  
            OnePlusOne = Add(1, 1),     // equals 2  
            OnePlusTwo = Add(1, 2)      // equals 3  
    ]  
in  
    AddResults  

Hitta det första elementet i en lista som är större än 5, eller annars null

let  
    FirstGreaterThan5 = (list) =>   
        let   
            GreaterThan5 = List.Select(list, (n) => n> 5),  
            First = List.First(GreaterThan5)  
        in  
            First,  
    Results =   
    [  
            Found    = FirstGreaterThan5({3,7,9}),  // equals 7  
            NotFound = FirstGreaterThan5({1,3,4})   // equals null  
    ]  
in  
    Results  

Funktioner kan användas rekursivt. För att rekursivt referera till funktionen prefixet identifieraren med @.

let   
    fact = (num) => if num = 0 then 1 else num * @fact (num-1)   
in   
    fact(5) // equals 120  

Each-nyckelord

Nyckelordet each används till skapa enkla funktioner. "varje ..." är syntaktisk socker för en funktionssignatur som tar _ parametern "(_) => ..."

Each är användbar när den kombineras med sökoperatorn, som används som standard i _
Till exempel är varje [CustomerID] samma som varje _[CustomerID], som är samma som (_) => _[CustomerID]

Exempel – Använda each i tabellradsfilter

Table.SelectRows(  
      Table.FromRecords({  
            [CustomerID = 1, Name = "Bob", Phone = "123-4567"],  
            [CustomerID = 2, Name = "Jim", Phone = "987-6543"] ,  
            [CustomerID = 3, Name = "Paul", Phone = "543-7890"] ,  
            [CustomerID = 4, Name = "Ringo", Phone = "232-1550"]  
      }),   
      each [CustomerID] = 2  
)[Name]  
  
// equals "Jim"