LINQクエリが分からない? 私も分からない! -調査してみた件-

概要:

大学時代にC#やSQLなど触っていなかったため、もちろんLINQについても分からないことが多くあったのでまとめてみる。

LINQとは?

統合言語クエリ (LINQ: Language-Integrated Query) とは、様々な種類のデータ構造に対して、統一したクエリを行うことができる、言語に統合された機能である。(データに対して、検索や整列などの処理が可能)ちなみに、統合言語クエリの「統合」とは、“データの種類に合わせて異なる言語を使用し操作していたもの”を統一した言語で操作可能にするという意味合いを持っている。

LINQの種類

LINQプロバイダーにより、各種オブジェクトに対するクエリが実行可能である。また、プロバイダーはアクセスするデータソースに応じて切り替わるため、開発者がプロバイダーの違いを意識しコーディングする必要はほとんどない。

LINQの種類

LINQの記述方法(例)

実際にC#を用いてLINQクエリを作成する二つの方法(クエリ構文、メソッド構文)を紹介する。以下に示す例は、placesに格納されている単語からLINQを用いて文字数が5の単語を取り出し、先頭から三文字をコンソールに出力するプログラムである。クエリ構文とメソッド構文それぞれの例を示す

string[] places = {
    "東京大学","大阪大学","名古屋大学",
    "北海道大学","東北大学","京都大学","九州大学"
};

IEnumerable<string> result = from p in places
                                where p.Length == 5
                                orderby p
                                select p.Substring(0, 3);

foreach (var place in result)
{
    Console.WriteLine(place);
}

実際の動き(上記の赤色)としては、fromでplacesに格納されている要素を変数pに一時的に格納し、whereを用いて要素の長さが5のデータを抽出する。そして、orderbyで抽出したデータに対してソートを行い、selectで出力形式(先頭から3文字)を指定し、resultに代入している。予備知識としては、Where、Selectなどに複雑な処理(デリケート、匿名メソッド)を埋め込むことも可能である。また、このクエリ動作が行われるのはforeachでアクセスされるタイミング(結果を取得するタイミング)である。以下に構文の詳細を示す。

from

対象となるデータの集合(データソース)を表すための句であり、次のような構文で表記する。

from データ変数 in データの集合

データ変数とは、データの集合から個々の要素を一時的に格納するための変数である。

where

データソースから抽出する要素の条件を指定する。(使用する言語の比較演算子を使用する)

where 抽出条件

orderby

指定した変数を昇順に並べ替える。(降順の場合:OrderByDescendingメソッドを使用する)

orderby 抽出順序のキー項目

select

出力形式を指定する

select 抽出するメンバで構成される新しいクラス;

string[] places = {
    "東京大学","大阪大学","名古屋大学",
    "北海道大学","東北大学","京都大学","九州大学"
};

IEnumerable<string> result = places
                            .Where(p => p.Length == 5)
                            .OrderBy(p => p)
                            .Select(p => p.Substring(0, 3));
                            
foreach (var place in result)
{
    Console.WriteLine(place);
}

上記二つのプログラムを実行すると“北海道”“名古屋”が出力される。

まとめ

LINQ: Language-Integrated Queryとは、データに対して、検索や整列などの処理を行うことができる機能であり、様々な言語で統一した書式で記述可能である。本記事ではLINQについて調査した内容について紹介した。LINQの対象はDatabaseだけでなく、配列、XMLなど様々な場面で使用できるため、積極的に使用していくことが必要であろう。

参考文献:

https://docs.microsoft.com/ja-jp/dotnet/csharp/linq/write-linq-queries

%d人のブロガーが「いいね」をつけました。