かるあ のメモ

アクセスカウンタ

zoom RSS LINQ いつ更新されるの?

<<   作成日時 : 2007/09/14 20:58   >>

ブログ気持玉 0 / トラックバック 0 / コメント 0

前回 LINQ の遅延評価について必要なときに実行されるという話をしたと思います。
検索などの場合はそれほど問題は無いと思いますが、更新系の処理を行う場合は少し注意が必要です。

まず、サンプルと結果を見てください
Dim db = New comuplusDataContext()
db.Log = Console.Out

Dim query = db.User.Where(Function(u) u.UserID = "Newcomer").Select(Function(u) u.UserName)
Console.WriteLine(String.Format("更新前のメンバー数={0}", db.User.Count()))

' 追加
db.User.Add(New User() With {.UserID = "Newcomer", .UserName = "期待の新人", .UpdateDate = DateTime.Now})

Console.WriteLine(String.Format("Add 後のメンバー数={0}", db.User.Count().ToString()))
Console.WriteLine(String.Format("追加したメンバ={0}", If(query.Count = 0, "まだいないみたい", query.Single())))

' 確定
db.SubmitChanges()

Console.WriteLine(String.Format("SubmitChanges 後のメンバー数={0}", query.Count().ToString()))
Console.WriteLine(String.Format("追加したメンバ={0}", If(query.Count = 0, "まだいないみたい", query.Single())))


結果:
更新前のメンバー数=12

Add 後のメンバー数=12
追加したメンバ=まだいないみたい

SubmitChanges 後のメンバー数=1
追加したメンバ=期待の新人

この結果を見ると 追加 の部分で新しいユーザを追加しているにもかかわらず、その次の行で更新データを確認するとユーザは追加されていません。
これは db.User.Add() で追加しても SubmitChanges() が呼び出されるまで評価が遅延されるためです。
もし SubmitChanges() が呼び出される前に追加したデータを参照するようなコードを書いていると予期した結果とは違う結果になってしまいますね。
(まぁデータが確定してから SQL を投げろていうのはあるか)

さて、ここで問題です。
今回のプログラムでは何回 SQL を発行したでしょうか?

テーマ

注目テーマ 一覧


月別リンク

ブログ気持玉

クリックして気持ちを伝えよう!
ログインしてクリックすれば、自分のブログへのリンクが付きます。
→ログインへ

トラックバック(0件)

タイトル (本文) ブログ名/日時

トラックバック用URL help


自分のブログにトラックバック記事作成(会員用) help

タイトル
本 文

コメント(0件)

内 容 ニックネーム/日時

コメントする help

ニックネーム
本 文
LINQ いつ更新されるの? かるあ のメモ/BIGLOBEウェブリブログ
文字サイズ:       閉じる