【UiPath】Studioにおけるフィルター操作（後編）

# １．はじめに
　Studioにおけるフィルター操作方法に関して、前回はFilter Data Table ActivityとExcel Filter Activityという2つの方法を紹介しました（興味のある方は[こちら](https://qiita.com/Ouyang/items/688a696abaa1278b9d9b)をご参照ください）。コードをいじらずにExcelのデータが抽出できる以上の方法は、使いやすくて非常に便利だと言えます。ただし、データ量が膨大で処理のスピードが遅くなったり、フィルター条件が複雑でデータが絞りにくくなったりすることもあります。そのため、今回は、その問題に対応する2つの方法をご紹介しようと思います。
 
# ２．Studioで利用できるフィルター操作方法
　①Filter Data Table Activity（前編）
　②Excel Filter Activity（前編）
　③Selectメソッド
　④LINQクエリ

# ３．環境情報
　利用する環境は以下の通りとなります。
| ソフトウェア名 | バージョン情報 |
|:-----------|:------------|
| OS       | Windows10        |
| Studio     |   23.10.0    | 
| UiPath.EXCEL.Activities       | 2.22.2        | 

# ４．データ準備とワークフローの完成図
　より容易に本文を理解できるように、筆者は以下のサンプルデータを用意しました。
　![無題4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3334103/7f01362a-0b45-e83c-e901-6f6d44b663e8.png)
　なお、以下はSelectメソッドやLINQクエリを利用したワークフローの完成図です。ご参照ください。
　![2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3334103/6e9d4b89-4572-4083-dbae-1528a8425509.jpeg)
　　　　　　　　　　　　Selectメソッド

　![1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3334103/e0deddb7-c603-ae41-5f23-27b6faa4c5ad.jpeg)
　　　　　　　　　　　　LINQクエリ


# ５．具体的な操作方法
## ③Selectメソッド
　Selectメソッドは、データテーブルを操作するメソッドなので、Excelのデータを読み込み、データテーブルとして抽出する必要性があります。
 ![無題1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3334103/1ca66471-f002-def1-ace3-072f4740d65b.png)

 　データテーブルにした後、代入アクティビティを配置し、以下の形で書きます。
  
　**保存先のDatatable変数＝操作対象のDatatable変数.Select(“[列名]＝'条件'“).CopyToDatatable**

　文字列のデータに対してフィルターをかける場合、条件をシングルコーテーションで囲みます。例えば、部門をITに限定する場合、　**[Department]＝'IT'**　と書きます。
　数値型のデータに対してフィルターをかける場合、条件の外でシングルコーテーションはいりません。例えば、給料が20000以下のデータに絞りたいとしたら、書き方は　**[Salary]<20000**　となります。

　SelectメソッドでITとHR部門にあたったデータを抽出してみましょう。代入式の書き方は以下のようです。
　![無題2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3334103/625b3220-1ed3-45b5-9359-029d9af40c19.png)
　その後、絞ったデータをExcelに書き込んだら、ちゃんとできましたね↓
　![無題5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3334103/1125912b-0259-8a5b-539c-41f56004fb8d.png)

　そのうえ、条件がどんどん増える場合、論理演算子と括弧を組み立て、フィルター条件をつなげばいいと思います。例えば、上記のデータで、さらに給料が20000以下という条件を追加したい場合、書き方は以下のようとなります。
 
　![無題3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3334103/9d6e4770-4b80-6724-8f65-6af6344ff198.png)

　その結果、部門がITかHR、且つ給料が20000以下のデータを取得しました。
 
　![画像4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3334103/28eb6a9c-b915-19ef-e92f-c8651638be89.png)


 ## ④LINQクエリ
　LINQ（Language-Integrated Query）は、.NET Frameworkで提供されている言語統合型のクエリ技術です。これは、配列、コレクション、XML文書、データベースといったデータソースに対して、SQLに似たクエリ構文やメソッド呼び出しを使用してデータを効果的にクエリおよび変換するための手段を提供します。 LINQを使用すると、データに対する複雑な操作をより簡潔で読みやすい形で表現できます。UiPath StudioでLINQコードを使用する際には、主にVB.NETのLINQクエリを組み込むことが一般的です。
　以下はUiPath StudioでLINQを使用する基本的な手順です。
 
　i.Excelのデータをデータテーブルとして抽出します。（本文において、アウトプットをdbt1に保存します）
　ii.代入アクティビティを配置し、左側で絞った結果を格納する変数を作成し、右側はLINQクエリの構文を入れます。絞った対象により、書き方は変わります。

| ケース | 構文 |
|:-|:-|
|数値フィルター   |保存先のDatatable変数＝操作対象のDatatable変数.AsEnumerable().Where(Function(r)Cint(r("列名"))＜条件).CopyToDataTable   |
|文字列フィルター   |保存先のDatatable変数＝操作対象のDatatable変数.AsEnumerable().Where(Function(r)r("列名").ToString()="条件").CopyToDataTable   |
|複数条件の組み立て   |保存先のDatatable変数＝操作対象のDatatable変数.AsEnumerable().Where(Function(r)Cint(r("列名"))＜条件 AndAlso r("列名").ToString()="条件").CopyToDataTable   |

　iii.データテーブルをExcelに書き込む。

　コードが長くて、理解しづらいところもあるため、少し説明いたします。
　まず、AsEnumerableはLINQの中の拡張メソッドの一つです。LINQクエリはDataTable を直接処理できません。AsEnumerableを使用すると、DataTable を LINQ で処理できる型IEnumeable＜DataRow＞に変換できます。その後のWhereなどのLINQ操作が適用できるようにしているものと考えられます。
　次に、Whereはのメソッドで、コレクション内の要素をフィルタリングするために使用されます。これにより、特定の条件を満たす要素だけが結果セットに含まれます。 
　さらに、`r`はコレクション内の各行のデータを表します。ラムダ式では、`r`はパラメータ名です。`r("salary")`または`r.Item("salary")`を使用して現在の行の "salary" 列の値を取得し、`r("Department")`を使用して "Department" 列の値を取得できます。
　最後に、Cint( )とToString.( )は変数をそれぞれ数値と文字列に変換するメソッドです。

　では、実例を見てみましょう。
　例1、所属がITのデータを抽出します。
　![無題6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3334103/0393dbd7-eeda-cc96-fe7e-7ddff3c74dba.png)
　そうしたら、IT以外のデータが削除されました。
　![画像6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3334103/8fbad86e-0c74-776c-53b6-1afe082a583f.png)

　例2、所属がITで給料が20000以下のデータを抽出します。
　![無題7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3334103/dd7b148d-720b-e1e6-e00e-8b633181c008.png)
　結果は以下の通りです。
　![画像7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3334103/3100a34b-691d-40ba-1d46-1757dd1057c7.png)
　ちゃんと取りましたね。


# ６．最後に
　以上でStudioにおけるフィルター処理の4つの方法をご紹介しました！Filter Data Table ActivityとExcel Filter Activityとも、コードの使用がほぼないため、初心者にとってともて使いやすい方法となります。一方で、フィルター操作を高速化し、複雑のフィルター条件でデータを絞りたい方は、ぜひSelectメソッドやLINQクエリを使ってみてください。

:::note info
 代入式の最後に、**.CopyToDatatable**が入っているのですが、それは③Selectメソッドで抽出した結果がDataRow型であるためです。**.CopyToDatatable**を削除するとしたら、代入アクティビティの左側の変数もDataRow型に変更しなければなりません。一方で、④LINQでDataTable.AsEnumerableに対してSelectを呼び出すと、その返り値の型はIEnumerable＜DataRow＞型となるので、**.CopyToDatatable**を削除するとしたら、代入アクティビティの左側の変数の型は、IEnumerable＜DataRow＞型とする必要があります。
:::