LINQとは何か?
LINQ(Language Integrated Query:統合問い合わせ言語)とは、C# や Visual Basic などに標準で搭載されているデータベースや配列、リストなどに対する問い合わせ言語です。
LINQ を使うと、データベースなどから必要な情報を簡単に取得することができます。
LINQ に関する詳しい内容は、以下のマイクロソフト公式サイトを参照してください。
LINQの記述方法の種類
LINQ には、以下の 2通りの記述方法があります。
- クエリ構文:SQL文のように from、where、select などのキーワードを使って記述する方法
- メソッド構文:Where()、Select()などのメソッドをつなげて記述する方法
今回の記事では、LINQを使った検索処理を、クエリ構文とメソッド構文で同じ結果になるようにサンプルを例示します。
クエリ構文
クエリ構文は、SQL(Structured Query Language)文に似た構文で、from句、where句、select句などを使ってコードを記述します。
クエリ構文の例
var data = new int[] { 1, 2, 3, 4, 5 };
var val = from x in data where x > 2 select x;
上記の例では、1~5 までの値が入っている配列から、LINQ を使って 3~5 の値を取得します。
メソッド構文
メソッド構文は、マイクロソフトから提供されている Where()メソッドや Select()メソッドなどを使ってコードを記述します。
メソッド構文を使って、上記のクエリ構文と同じ結果を取得するには、以下のように記述します。
メソッド構文の例
var data = new int[] { 1, 2, 3, 4, 5 };
var val = data.Where( x => x > 2 );
メソッド構文で使用できるメソッドには、多くの種類があります。
詳しくは、以下のマイクロソフト公式サイトを参照してください。
LINQを使ったプログラムを作成する
では、実際に LINQ を使ったプログラムを作成してみましょう。
簡単な例として、1~5 の値が入っている配列から偶数の値を表示するプログラムです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
namespace LinqSample { internal class Program { static void Main(string[] args) { var data = new int[] { 1, 2, 3, 4, 5 }; // クエリ構文 var val1 = from x in data where x % 2 == 0 select x; Console.WriteLine(String.Join(",", val1)); // メソッド構文 var val2 = data.Where(x => x % 2 == 0); Console.WriteLine(String.Join(",", val2)); } } } |
実行結果
2,4
2,4
次に配列の中から最大値、最小値を取得するプログラムです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
namespace LinqSample { internal class Program { static void Main(string[] args) { var data = new int[] { 1, 2, 3, 4, 5 }; // クエリ構文 var val1 = $"{(from x in data select x).Max()},{(from x in data select x).Min()}"; Console.WriteLine(val1); // メソッド構文 var val2 = $"{data.Max()},{data.Min()}"; Console.WriteLine(val2); } } } |
実行結果
5,1
5,1
最後に若干難しくなりますが、匿名型のオブジェクトをグループ化して、それぞれの平均値を取得するプログラムです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
namespace LinqSample { internal class Program { static void Main(string[] args) { var data = new[] { new { Name="国語", Value=50 }, new { Name="英語", Value=30 }, new { Name="国語", Value=0 }, new { Name="英語", Value=90 }, }; // クエリ構文 foreach (var val1 in from x in data group x by x.Name) { Console.Write($"{(from x in val1 select x.Name).First()}:"); Console.WriteLine($"{(from x in val1 select x.Value).Average()}"); } // メソッド構文 foreach (var val2 in data.GroupBy(x => x.Name)) { Console.Write($"{val2.Select(x => x.Name).First()}:"); Console.WriteLine(val2.Select(x => x.Value).Average()); } } } } |
実行結果
国語:25
英語:60
国語:25
英語:60
クエリ構文とメソッド構文のどちらを使うか
上記のサンプルコードを見ても分かるように、メソッド構文の方が簡潔に記述することができますが、複雑なクエリを使用する場合は、クエリ構文の方が適しています。
クエリ構文とメソッド構文のどちらかを使うかは、プロジェクトの方針や個人の好みによりますが、マイクロソフトではクエリ構文を推奨しているようです。
記事一覧