C#でLINQのクエリを書く方法は2つあります。
1つはメソッド形式です。LINQのメソッドを生で書きます。
もう1つはクエリ式で、専用のSQL風構文が用意されています。
このうち見かける頻度が高いのはメソッド形式です。自由度が高く何でもできます。
しかし、教科書やマニュアルなどに出てくる頻度はクエリ式の方が多いと感じます。こっちの方が基本的なのでしょう。
さて、どうして同じ機能を実現する書式が2つあるのでしょうか。
それは、LINQがもともとSQL文をソースに書き込めればいいのにね、というところからSQLそっくりの構文が用意され、それを使うためのサポートメソッドが整備されたからです。でも、データベースと関係利用者にはSQLなど関係ないし、メソッドを直接使った方がより柔軟性が高いので、クエリ式はあまり好まれていないように感じられます。
(私? 私も普段はメソッド形式しか使いません)
罠の数々 §
- 実行結果を見ると492549となっていて49が繰り返されているように見えるが、実際は4, 9, 25, 49の並びで、4と9が連続して49に見えているだけである
参考リンク §
from 句 (C# リファレンス)
where 句 (C# リファレンス)
select 句 (C# リファレンス)
Enumerable.Where メソッド
Enumerable.Select メソッド
where句とWhereメソッド、select句とSelectメソッド、それぞれ何が違うのだろうか。上記のリンクから辿って確認してみよう。
リポジトリ §
https://github.com/autumn009/cshowto
TwoQuery §
using System;
using System.Linq;
class Program
{
static void Main()
{
int[] array = { 2, 3, 5, 7, 11, 13, 17 };
// メソッド形式
var q1 = array.Where(c => c < 10).Select(c => c * c);
// クエリ式
var q2 = from c in array where c < 10 select c * c;
foreach (var item in q1) Console.Write(item);
Console.WriteLine();
foreach (var item in q2) Console.Write(item);
Console.WriteLine();
}
}
実行結果
492549
492549