こちらは前回の続きです。
Entity Frameworkの感想としては、まずコネクションの処理が要らないこと。あと、SaveChangesでトランザクションの管理も勝手にやってくれるんですね。手動で切り替えてトランザクションの管理もできるらしいです。でも、纏めて入れる時はリストで追加すればいいし、あんまり手動は使はなくてもいけるんじゃないかな。あ、Selectした値に対してUpdateする時に手動が必要ですね。まあ、通常はトランザクションの管理もしてくれるし、楽そうですね。
そして、何と言ってもデータベースの処理は、1個カラムが追加されるとあっちもこっちも直さなきゃいけないのが面倒くさいんです。もう稼働しているシステムの追加案件だったりすると、ほぼこの作業(カラムが増えて、あっちもこっちも直す)だったりします。ここで自動生成されるモデルクラスは、変に継承とかしてないので使いまわしが出来そう。これすごく便利!Entity Framework便利じゃないですか。
しかし、データベースの醍醐味と言えばSelectですよね。こんな感じの簡単なテーブルを作成して、Joinをやってみました。
AuthorTable
名前 | データ型 |
---|---|
Id | int |
Name | varchar(50) |
PressTable
名前 | データ型 |
---|---|
Id | int |
Name | varchar(50) |
BookTable
名前 | データ型 |
---|---|
Id | int |
AuthorId | int |
PressId | int |
BookName | varchar(50) |
Price | int |
まずは、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");
これは、あんまり好ましくないみたいな事を書いてましたが、なんで?これじゃ駄目なの?
しかし、ポコポコ、ポコポコと次々と新しい技術が沸き上がって来てる気がするんですが、これらはすべてプログラマーを便利にする為のものですが、昔よりプログラマーって便利になって楽になってるんでしょうか?ちょっと疑問。。