2020年11月09日
川俣晶の縁側ソフトウェアC# コーディング How To total 385 count

【入門級】クエリの書き方は2つある

Written By: 川俣 晶連絡先

 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

COOL C# CREW

C#ハウツー連載の解説増量、カラーのソース、新規書き下ろし追加の読みやすい単行本はこちら。

C#ハウツー: 逆引き入門・こんな機能はどう書くの?