Linq with inheritable Dao
Linq to SQLでDAOパターンかつCRUDな感じにしたくてInterfaceとかabstractでいろいろやっていたのだが、ジェネリックでシンプルに解決できそうなのでメモ。
DBの後始末等いろいろ雑なのはご愛嬌。
ポイントは
public class BaseDao : IDisposable { protected MyDatabase ctx; public BaseDao() { this.ctx = new MyDatabase(Resources.ConnectionString); } public T Find<T>(T entity) where T : class { <del>try {</del> return (from o in this.ctx.GetTable<T>() where o == entity select o).Single<T>(); <del>} catch (Exception e) { throw e; }</del> } public IEnumerable<T> FindAll<T>() where T : class { try { return from o in this.ctx.GetTable<T>() select o; } catch (Exception e) { throw e; } } public void Put<T>(T entity) where T : class { try { this.ctx.GetTable<T>().InsertOnSubmit(entity); this.ctx.SubmitChanges(); } catch (Exception e) { throw e; } } public void Delete<T>(T entity) where T : class { try { this.ctx.GetTable<T>().DeleteOnSubmit(entity); this.ctx.SubmitChanges(); } catch (Exception e) { throw e; } } #region IDisposable Members public MyDatabase GetContext() { return this.ctx; } public void Dispose() { this.ctx.Dispose(); } #endregion }
あ、Updateがねぇや。まぁ、あとはこれを継承して使うと。
C#の情報って@○T(伏字)とかばっかで古いのしか見つからないんだけど、みんなどうしてんの??
今回参考にしたのはこちら。
http://blogs.msdn.com/b/msmossyblog/archive/2009/01/11/linq-to-sql-poormans-dao-crud.aspx
【2010/12/05 追記】
例外処理が仕方が間違っている。
Findについてはクエリをreturnしているだけなので、この時点では評価は行われていませんと。
これを実際にforeachなどするときに例外処理すべし。
参考にさせていただきました。
http://d.hatena.ne.jp/gsf_zero1/20091204/p3