Programing,  その他

Entity Frameworkを使ってみた②

こちらは前回の続きです。

Entity Frameworkの感想としては、まずコネクションの処理が要らないこと。あと、SaveChangesでトランザクションの管理も勝手にやってくれるんですね。手動で切り替えてトランザクションの管理もできるらしいです。でも、纏めて入れる時はリストで追加すればいいし、あんまり手動は使はなくてもいけるんじゃないかな。あ、Selectした値に対してUpdateする時に手動が必要ですね。まあ、通常はトランザクションの管理もしてくれるし、楽そうですね。

そして、何と言ってもデータベースの処理は、1個カラムが追加されるとあっちもこっちも直さなきゃいけないのが面倒くさいんです。もう稼働しているシステムの追加案件だったりすると、ほぼこの作業(カラムが増えて、あっちもこっちも直す)だったりします。ここで自動生成されるモデルクラスは、変に継承とかしてないので使いまわしが出来そう。これすごく便利!Entity Framework便利じゃないですか。

しかし、データベースの醍醐味と言えばSelectですよね。こんな感じの簡単なテーブルを作成して、Joinをやってみました。

AuthorTable

名前データ型
Idint
Namevarchar(50)

PressTable

名前データ型
Idint
Namevarchar(50)

BookTable

名前データ型
Idint
AuthorIdint
PressIdint
BookNamevarchar(50)
Priceint

まずは、BookTableとAuthorTableをJoinしてみます。調べたら書き方色々あるようですね。

 var result = context.BookTable.Join(
              context.AuthorTable,
              b => b.AuthorId,
              a => a.Id,
              (b, a) => new { b.BookName, b.PressId, b.Price, a.Name }).ToArray();
var result = from b in context.BookTable
             join a in context.AuthorTable
             on b.AuthorId equals a.Id
             select new { b.BookName, b.PressId, b.Price, a.Name };

どちらも同じ事みたいです。resultはforeachで回せます。では、3つJoinってどうやるの?調べた結果こうやって出来ました。正直、分かりにくい・・・。

var result =
    context.BookTable.Join(context.AuthorTable, b => b.AuthorId, a => a.Id, (b, a) => new { b, a })
    .Join(context.PressTable, oa => oa.b.PressId, p => p.Id, (oa, p) => new { oa, p })
     .Select( s => new {
              AuthorName = s.oa.a.Name,
              PressName = s.p.Name,
              BookName = s.oa.b.BookName,
              Price = s.oa.b.Price
              });

Select文って、JoinしてJoinしてJoinしてJoinして、いったい何個Joinしてるんだろうっていう構文よく見るんですが、あと癖のあるSQL文を書かないといけなかったり、、SQL文書きたい。。。調べたらSQL文で実行する方法を見つけました。

まず、ビューテーブルを作って、再度モデルクラスを自動生成して、

public partial class BookTableView
{
    public string AuthorName { get; set; }
    public string PressName { get; set; }
    public string BookName { get; set; }
    public int Price { get; set; }
 }

こんなモデルクラスができました。そして、これでも出来ました。

var result = context.Database.SqlQuery<BookTableView>
             ("SELECT "+
              "a.Name AS AuthorName, " +
              "p.Name AS PressName, " +
              "b.BookName AS BookName, " +
              "b.Price AS Price " +
              "FROM " +
                  "BookTable b " +
                  "INNER JOIN AuthorTable a " +
                      "ON b.AuthorId = a.Id " +
                  "INNER JOIN PressTable p " +
                      "ON b.PressId = p.Id");

これは、あんまり好ましくないみたいな事を書いてましたが、なんで?これじゃ駄目なの?

しかし、ポコポコ、ポコポコと次々と新しい技術が沸き上がって来てる気がするんですが、これらはすべてプログラマーを便利にする為のものですが、昔よりプログラマーって便利になって楽になってるんでしょうか?ちょっと疑問。。

Follow me!

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

PAGE TOP