分類:[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();
|