VSCode + .NET Interactive で PowerFx を体験してみよう

# はじめに

[PowerFx](https://docs.microsoft.com/ja-jp/power-platform/power-fx/overview) が[オープンソースとして公開](https://github.com/microsoft/power-fx)され、独自のアプリに PowerFx を組み込むことができるようになりました。

https://powerapps.microsoft.com/en-us/blog/power-fx-open-source-now-available/

この記事では、PowerrFx で実際にどのようなことができるかを VSCode の拡張機能である .NET Interactive を使って確認して行きます。

# プログラムからの PowerFx の利用

たとえば C# であれば、アプリに次の 2 つのパッケージを追加するだけで、PowerFx の実行エンジンを実体化させプログラム中で PowerFx の式を評価することができます。
この機能を使った PowerFx の対話型アプリのサンプルは [power-fx-host-samples](https://github.com/microsoft/power-fx-host-samples) として GitHub に公開されています。

```sh
❯ dotnet new console
❯ dotnet add package Microsoft.PowerFx.Core --prerelease
❯ dotnet add package Microsoft.PowerFx.Interpreter --prerelease
```

```cs:Program.cs
using Microsoft.PowerFx;
var engine = new RecalcEngine();
var result = engine.Eval("Sum(1, 2, 3)");
Console.WriteLine(result.ToObject());
```

```sh:実行結果
❯ dotnet run
6
```

# VSCode + .NET Interactive + PowerFx

VSCode の .NET Interactive 上で動作する PowerFx の拡張機能は [PowerFx.NET.Interactive](https://github.com/rajyraman/Power-Fx-.NET-Interactive) という NuGet ライブラリとして公開されています。動作させるには、[README](https://github.com/rajyraman/Power-Fx-.NET-Interactive/blob/main/README.md) 従い VSCode の[.NET Interactive 拡張](https://marketplace.visualstudio.com/items?itemName=ms-dotnettools.dotnet-interactive-vscode)と、[DataTable 拡張](https://marketplace.visualstudio.com/items?itemName=RandomFractalsInc.vscode-data-table)を有効にします。

.NET Interactiveで作業をするためにノートを作成しましょう。
新しい .NET Interactive のノートを作成する場合は、`Ctrl`+`Shift`+`Alt`+`N` でノートを作成します。もしくはコマンドパレットから `.NET Interactive: Create new blank notebook` を実行してもよいです。
作成するノートの拡張子は `.dib` でも `.ipynb` でもどちらでも大丈夫です。言語は `C#` を選択してください。

ノートが作成されたら、まずは PowerFx のカーネルを NuGet から取得してインストールします。

```
#r "nuget: PowerFx.NET.Interactive, 0.0.9.7"
```

現時点のバージョンではこれらの組み込みの数式に対応しているようです。
詳細については、PowerApps の [Formula reference](https://docs.microsoft.com/en-us/powerapps/maker/canvas-apps/formula-reference) を参照してください。

> Abs, AddColumns, And, Average, Average, Blank, Concat, Coalesce, Char, Concatenate, CountIf, CountRows, Date, DateAdd, DateDiff, DateValue, DateTimeValue, Day, EndsWith, Exp, IsBlank, IsError, IsToday, If, IfError, Int, Filter, First, FirstN, ForAll, Hour, Last, LastN, Left, Len, Ln, Log, Lower, Max, Max, Mid, Min, Min, Minute, Mod, Month, Not, Now, Or, Power, Replace, Right, Round, RoundUp, RoundDown, Second, Sequence, Sort, StartsWith, Sum, Sum, Split, Sqrt, Substitute, Switch, Table, Text, Time, TimeValue, Today, Trim, TrimEnds, Trunc, Upper, Value, With, Year

PowerFx の式を実行する場合は、`#!powerfx` でカーネルを指定して実行します。例えば、`records` という変数にテーブルを読み込み、Value が 40 より大きいものを昇順でソートした 1 件目を表示するとしたら次のような式になります。

```
#!powerfx
ClearCollect(records, Table(
    { Id: 1, Name: "Hoge1", Value: 1 },
    { Id: 2, Name: "Hoge2", Value: 13 },
    { Id: 3, Name: "Hoge3", Value: 44 },
    { Id: 4, Name: "Hoge4", Value: 43 }
));

Upper(First(Sort(Filter(records, Value > 40), Value)).Name)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36535/b594cd0c-2370-cc71-6aba-e02e23586508.png)

また、変数に式を設定するとその値は追跡されそれを参照している変数は自動的に再計算されていることも確認できます。

```
#!powerfx
Set(val1, 1);
Set(val2, val1 + 2);
val3 = val1 + 2;
Set(val1, 2);
val2;
val3;
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36535/f73f8040-a512-6a3c-b901-0a1d026c0988.png)

# おわりに

PowerFx 自体は Power プラットフォーム上ではすでに利用可能で、今後 PowerAutomate などに移植されるとさらに利用用途が広がり面白くなりそうな機能です。
.NET Interactive の拡張機能はプレリリース版なので、動作が若干怪しい部分もありますが簡単に試してみるには面白と思うので気になる人は触ってみると良いと思います。