読者です 読者をやめる 読者になる 読者になる

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