C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

DataContextで取得したデータのインスタンス化

[トピック内 3 記事 (1 - 3 表示)]  << 0 >>

■87400 / inTopicNo.1)  DataContextで取得したデータのインスタンス化
  
□投稿者/ hiro (1回)-(2018/05/17(Thu) 20:06:05)

分類:[C#] 

System.Data.LinqのDataContextについてです。
環境としては、WindowsForms、.NetFramework4.5、SQLServer2014を前提にしています。

WindowsFormでSQLServerよりデータ取得するロジックで、DBアクセスロジックが散在するのを回避するために、DBアクセス用のクラスを設けました(DBクラスとします)。

その過程で、下記の現象を見つけ、疑問に思いましたので投稿させて頂きます。

(DBクラス)db.Open()
↓
(DBクラス)データ取得
↓
(DBクラス)db.Close()
↓
(呼出元)取得したデータをToArray()

とすると、呼出元でデータが取得できてしまうのですが、呼出元でしかインスタンス化していないはずで、その前にdb.Close()しているのにデータが取得できるのは何故でしょうか。どこかでインスタンス化がされているのでしょうか。

【サンプルコード】
IEnumerable<SampleMaster> hoge () {
  try
  {
    var db = new DataContext();
      db.Open();

      var data = db.DbContext.SampleMaster
                 .Where(m => m.testCol == "test");
  }
  finally
  {
    db.Close();
  }
}


そもそも、各フォームの中にDBの取得ロジックが散在することを回避したいのですが、この考え方自体は一般的にはどうなのでしょうか。外部クラスにすると詳細な条件指定がしづらく、かといって呼出元で条件指定をするとインスタンス化したSelect結果を返り値にしてやり、呼出元でさらにインスタンス化する処理が必要になると思います。となっては最初に戻って各フォームにDBのロジックを書くべきでしょうか。

【サンプルコード】
class DBClass {
  SampleMaster[] hoge () {
   using (var db = new DataContext()) {
        db.Open();
  
        var data = db.DbContext.SampleMaster
                   .Where(m => m.testCol == "test")
                   .ToArray();
   }
  }
}

呼出元
var db = new DBClass();
var data = db.hoge().Where(h => h.testCol2 == "testCol2")
           .ToArray();


引用返信 編集キー/
■87401 / inTopicNo.2)  Re[1]: DataContextで取得したデータのインスタンス化
□投稿者/ WebSurfer (1499回)-(2018/05/17(Thu) 20:44:14)
マルチポストのようなので他のポスト先の URL を書いておきます。

https://social.msdn.microsoft.com/Forums/ja-JP/4924282f-c203-4d65-ac00-d6ae71282ff3/datacontextselect?forum=netfxgeneralja
引用返信 編集キー/
■87404 / inTopicNo.3)  Re[2]: DataContextで取得したデータのインスタンス化
□投稿者/ hiro (2回)-(2018/05/18(Fri) 09:44:07)
No87401 (WebSurfer さん) に返信
> マルチポストのようなので他のポスト先の URL を書いておきます。
>
> https://social.msdn.microsoft.com/Forums/ja-JP/4924282f-c203-4d65-ac00-d6ae71282ff3/datacontextselect?forum=netfxgeneralja

基本的なルールを知らず申し訳ありません。
リンク先の削除方法がすぐに分かりませんでしたので、また週末に対応します。
よろしくお願い致します。
引用返信 編集キー/

このトピックをツリーで一括表示


トピック内ページ移動 / << 0 >>

このトピックに書きこむ