今日もちょいつか

お酒の飲み過ぎか、それとも歳のせいなのか毎日ちょっぴり疲れ気味なフリーのソフト屋です。ソフト開発の話題をblogにしてみます。

ASP.NET Core MVC LINQを使ってみる

LINQ (Language Integrated Query) についてまとめてみました。
ASP.NET MVCで開発するには必須の技術となっています。
いままでだと、データベースシステムを開発するときには
SQLを駆使して処理を作成していましたが
ASP.NET MVCではDbContextに格納されたデータに対して
LINQを使って必要なデータを取得するのが作法となっているようです。
新しいことを覚えるのは大変ですが、学ぶのは楽しいことでもあります。
動作は、Visual Studio Community 2017 for Mac で行なっています。

動作確認に利用するデータ

LINQの動作確認に利用するデータ定義です。

var members = new[]{
      new { id = 1, Name = "ゆきこ", Age = 30, SexID = 2},
      new { id = 2, Name = "ようこ", Age = 5 , SexID = 2},
      new { id = 3, Name = "ひろし", Age = 10, SexID = 1}
};
var sex = new[]{
      new { id = 1, Text = "男" },
      new { id = 2, Text = "女"}
};

クエリキーワード[group・by]

指定したキー値にもとづいて、グループ化した結果を返すことができます。

var q =
      from p in members
      orderby p.SexID
      group p by p.SexID;
            
      foreach(var g in q)
      {
          Console.WriteLine("----/" + g.Key.ToString() + "/----");
          foreach (var x in g) Console.WriteLine(x);
      }

実行結果はこうなります。

----/ 1 / ----
{ id = 3, Name = ひろし, Age = 10, SexID = 1 }
----/ 2 / ----
{ id = 1, Name = ゆきこ, Age = 30, SexID = 2 }
{ id = 2, Name = ようこ, Age = 5, SexID = 2 }

同じ処理をメソッド構文で記述してみます。

var m = members
       .OrderBy(x => x.SexID)
       .GroupBy(x => x.SexID);

クエリキーワード[orderby・ascending・descending]

各要素の値にもとづいてクエリ式で返す結果を並べ替えます。

var q =
      from p in members
      orderby p.SexID descending, p.Name
      select p;
      foreach(var x in q)
      {
         Console.WriteLine(x);
      }

この例だと、性別で降順にしてなおかつ名前で昇順にしています。
実行結果は

{ id = 1, Name = ゆきこ, Age = 30, SexID = 2 }
{ id = 2, Name = ようこ, Age = 5, SexID = 2 }
{ id = 3, Name = ひろし, Age = 10, SexID = 1 }

同じ内容をメソッド構文で記述してみました。

var m = members
      .OrderByDescending(x => x.SexID)
      .ThenBy(x => x.Name);

二つ目のソート条件を記述するのがクエリ構文と違って戸惑いました。

クエリキーワード[ join・in・on・equals ]

指定した値が一致している複数のデータソースを結合します。
よくある、コードから名前表示みたいな感じです。

var q =
      from m in members
      join s in sex on m.SexID equals s.id
      select new { m.id, m.Name, Sex = s.Text };
      foreach(var x in q)
      {
          Console.WriteLine(x);
      }

性別コードから性別を表示しています。
実行結果は

{ id = 1, Name = ゆきこ, Sex = 女 }
{ id = 2, Name = ようこ, Sex = 女 }
{ id = 3, Name = ひろし, Sex = 男 }

これを、メソッド構文で記述すると

var query = members.Join(
        sex,
        (x) => x.SexID,
        (y) => y.id, (x, y) => new {
                                     id = x.id, 
                                     Name = x.Name, 
                                     Sex = y.Text
});

恐ろしきラムダ式ですね。
書いている内容が呪文のようで理解ができません。
これは慣れるしかないのですかねー。

最後に

LINQにはクエリ構文とメソッド構文がありますが
メソッド構文で記述するとパット見、何をしているかわからない感じもあるので
クエリ構文がいいかなーと思ってしまいます。
できればどちらかに統一したい思いもありますので
どちらの構文を利用するか悩むところです。

仕事の気分転換に、自立式ハンモック

以前からハンモックに憧れていたのですが。
屋内で使える自立式ハンモックがあるのですね。
どんなのが良いのかわからないので、1万円を切るくらいのを買ってみました。
想像していたより気持ちがいいです。
特に左右に揺らすととても気分が癒やされます。
プログラムでハマった時に気持ちを落ち着けることができそうです。