気楽なソフト工房

プログラミングについていろいろな記事を書いています。



mykonos2008

Author:mykonos2008
システムエンジニアとして働いている30代の会社員です。
仕事や趣味でプログラムを書いている方の役に立つ記事を書いていきたいと思っています。
ご意見、ご感想はこちらまで
If you are an english speaker,Please visit my english blog.

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
さて、本日はwhere句を説明します。クエリの発行対象は前回の記事と同じく、Person型の配列を使用します。

    class Program
    {
        private Person[] persons = null;

        Program()
        {
            //クエリのデータソースを初期化する
            persons = new Person[]
            {
                new Person(){ LastName="Tanaka",FirstName = "ichiro", Age = 20},
                new Person(){ LastName = "Sato",FirstName = "Kazuhiro",Age = 25},
                new Person(){ LastName = "Wada",FirstName = "Takashi",Age = 30},
                new Person(){ LastName = "Asada",FirstName = "Kenji",Age = 40},
                new Person(){ LastName = "Tanaka",FirstName = "Tatsuta",Age = 26},
                new Person(){ LastName = "Yoshino",FirstName = "Taro",Age = 27}
            };
        }
    }

where句はデータソースから列挙するデータに対してフィルタをかけるための機能で、SQLのWhere句と同じ働きをします。
以下のサンプルを見てください。

   void SelectWhere()
   {
       var query = from person in persons
                   where person.Age >= 20 && person.Age < 30
                   select person;

       foreach (var person in query)
       {
           Console.WriteLine("{0}-{1}-{2}", person.LastName, person.FirstName, person.Age);
       }
   }

where句を使って年齢が20歳以上、30歳未満に該当する要素のみが列挙されるように記述しています。
条件を指定する際は、from句で指定した範囲変数「person」を使用しています。

where句を使う際には、条件に変数を用いるケースが多いと思います。
以下のようにクエリの中でも変数を利用することが出来ます。

   void SelectWhere(int fromVal,int toVal)
   {
       var query = from person in persons
                   where person.Age >= fromVal && person.Age < toVal
                   select person;

       foreach (var person in query)
       {
           Console.WriteLine("{0}-{1}-{2}", person.LastName, person.FirstName, person.Age);
       }
   }

where句には式の結果がブール値になるものであれば、何でも指定することが出来るので、
以下のようにメソッドを呼んでもOKです。

   void SelectWhereName(String name)
   {
       var query = from person in persons
                   where person.LastName.StartsWith(name)
                   select person;

       foreach (var person in query)
       {
           Console.WriteLine("{0}-{1}-{2}", person.LastName, person.FirstName, person.Age);
       }
   }

実際のアプリケーション開発においてはクエリを動的に組み立てるケースが多いと思います。
例えば、姓と名のそれぞれが条件として指定されれば、それを検索条件とし、指定されなければ、条件としない
といった場合、SQLだとWhere句を動的に生成するようなコードを記述することになると思います。

LINQでも式ツリーを使用することで動的にクエリを構築することが出来ますが、
これは少し難解なので、もう少し後の記事で題材にします。

今回は代替手段としてこんな方法を考えてみました。

   void SelectWihthName(String lastName, String firstName)
   {
       var query = from person in persons
                   where MatchesName(person, lastName, firstName)
                   select person;

       foreach (Person person in query)
       {
           Console.WriteLine("{0} {1} Age:{2}", person.LastName, person.FirstName, person.Age);
       }
   }

   bool MatchesName(Person person,String lastName, String firstName)
   {
       //姓が指定されている場合、チェックする
       if (lastName != null && !person.LastName.Contains(lastName))
       {
           return false;
       }

       //名が指定されている場合、チェックする
       if (firstName != null && !person.FirstName.Contains(firstName))
       {
           return false;
       }

       return true;
   }

where句には、ブール値を返すものであればメソッドも記述できますので、
条件の判定処理をメソッドの中に記述することにしました。

次回はorderby句です。

コメント

コメントの投稿

管理者にだけ表示を許可する

トラックバック

http://csfun.blog49.fc2.com/tb.php/65-c689a779

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。