LINQってややこしいですよね。プログラミング経験が浅い方には敷居が高い代物ではないでしょうか。メソッド構文のラムダ式なんてはじめは(今も・・・)チンプンカンプンでした。(笑)
LINQには主に2種類の構文が準備されています。ひとつが今回紹介するクエリ構文で、もう一つはメソッド構文です。メソッド構文には「->」が出現します。
クエリ構文は特にSQLに似ていますよね。ですが、SQLとは全くの別物です。これ勘違いしがちですよね。私もC#サイドでコーディングするSQLだと勝手に思い込んでいました。selectやらwhereなどSQLのコーディング経験がある方でしたら見覚えのある単語が出てくるから勘違いしちゃいますよね。
SQLとは全くの別物ですが、けっきょくはデータベースサイドでSQLに変換しないといけませんから、似たような単語がけっこう出てくるわけです。
正直、クエリ構文よりメソッド構文を理解することに力を注ぐべきです。クエリ構文はC#やVB.NETにしか出現しません。しかも微妙に書き方も変わってくるし・・・
ですが、私の個人のメモ書き程度にクエリ構文に出くわした時のために、データを取得する方法だけでも記載しておきます。ご参考にどうぞ!!
クエリ構文を使用してのデータの取得
以下のサンプルプログラムでは、LINQ to Entitiesを使用しています。
そして以下のサンプルは取得の基本の型ですね。「select」「from」「join」「where」「orderby」と取得クエリなら必須であろう命令群です。これさえまずは覚えていたら、取得はとりあえずできると思います。
注意が必要なのは、クエリ構文では外部結合なるものは存在しません。以下のプログラムでは、tempxxxに一時的に結合取得した内容を保存し、それにDefaultIfEmpty()をつけて取得します。これで外部結合ちっくなコーディングに変貌します。
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 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 |
using System; using System.Linq; namespace OUTPUT { class LINQ_TEST { EXCELEntities con = new EXCELEntities(); public void editexcel(EXCELEntities con) { var data = (from x in con.T_TOKYO // 内部結合 join y in con.T_OSAKA on new { NO = x.CITY_CODE } equals new { NO = y.CITY_CODE } // 外部結合 join xxx in (from m in con.M_XXX where m.DelFlg == "0" select m) on new { x.Cd, x.SEQ } equals new { xxx.Cd, xxx.SEQ } into tempxxx from xxxname in tempxxx.DefaultIfEmpty() // 外部結合 join yyy in con.M_COMPANY on x.CompanyCd equals yyy.CompanyCd into tempyyy from yyyname in tempyyy.DefaultIfEmpty() // 検索条件 where x.Nen == "2019" && x.Tuki == "10" && x.Status == "0" | x.Status == "1" // or && x.DelFlg == "0" // ソート orderby x.Cd, x.SEQ // 取得 select new { x, y, xxxname.Nm, yyyname }); con.Dispose(); // 破棄 foreach (var each in data) { } } } } |
上記では記述していませんが、よく使用される命令に「FirstOrDefault」や「LastOrDefault」があります。これはFirstOrDefaultだと最初の1行が返され、LastOrDefaultでは最後の1行が返されます。上記のプログラムに記述するならば、select new { x, y, xxxname.Nm, yyyname }).FirstOrDefault();となりますね。返すべき値がない場合ですと、参照型ならnullが返されます。
まとめ
いかがでしたでしょうか。
まだまだ取得で使える命令はたくさんあります。Unionなどもそうですよね。SQLではUnionを使う機会も多いと思います。
一番初めにも言いましたが、クエリ構文よりもやはりメソッド構文に力を注ぎましょうね。メソッド構文を覚えれば他の言語にも応用が利きますから。
最後までお読みいただきありがとうございました。