泛型linq,使用反射+泛型方法来处理Linq的修改

在使用Linq进行数据修改时操作比较麻烦,下面是我的Linq操作常用方法:
1.创建一个Linq To Sql的类,将数据库中数据拖到设计界面中如下图表结构:
使用反射+泛型方法来处理Linq的修改
2.编写DB.cs文件
    class DB
    {
        public static DBMDataContext db
        {
            get
            {
                return new DBMDataContext();
            }
        }
    }
3.编写CustomerDAL.cs文件
 
    class CustomerDAL
    {
        internal static void Add(HIS_Customers cust)
        {
            var db = DB.db;
            var mid = db.ExecuteQuery<int>("select isnull(MAX(id),0) from HIS_Customers").ToList()[0] + 1;
            cust.id = mid;
            db.HIS_Customers.InsertOnSubmit(cust);
            db.SubmitChanges();
        }
        internal static void Update(HIS_Customers cust)
        {
            var db = DB.db;
            var old = db.HIS_Customers.Single(d => d.id == cust.id);
            old.age = cust.age;
            old.age_unit = cust.age_unit;
            old.agent_addr = cust.agent_addr;
            old.agent_mobile = cust.agent_mobile;
            old.agent_name = cust.agent_name;
            old.agent_phone = cust.agent_phone;
            old.agent_relation = cust.agent_relation;
            old.agent_zip_code = cust.agent_zip_code;
            old.birth_place = cust.birth_place;
            old.card_id = cust.card_id;
            old.charge_type = cust.charge_type;
            old.create_datetime = cust.create_datetime;
            old.create_opt = cust.create_opt;
            old.date_of_birth = cust.date_of_birth;
            old.id_no = cust.id_no;
            old.id_type = cust.id_type;
            old.id_type = cust.id_type;
            old.job_occupation = cust.job_occupation;
            old.mailing_address = cust.mailing_address;
            old.mobile_num = cust.mobile_num;
            old.name = cust.name;
            old.name_phonetic = cust.name_phonetic;
            old.nation = cust.nation;
            old.phone_num = cust.phone_num;
            old.sex = cust.sex;
            old.unit_in_contract = cust.unit_in_contract;
            old.zip_code = cust.zip_code;
            db.SubmitChanges();
        }
        internal static void Delete(int id)
        {
            var db = DB.db;
            var old = db.HIS_Customers.Single(d => d.id == id);
            db.HIS_Customers.DeleteOnSubmit(old);
            db.SubmitChanges();
        }
        internal static List<HIS_Customers> FindAll()
        {
            return DB.db.HIS_Customers.ToList();
        }
    }
 
其中的修改方法是最麻烦的,表中字段多时就是一体力活.
 
4.使用反射+泛型方法写了一个CopyValue的方法放在DB.cs文件中,修改完后的DB.cs如下:
    class DB
    {
        public static DBMDataContext db
        {
            get
            {
                return new DBMDataContext();
            }
        }
        public static void CopyValue<T>(T from, T to)
        {
            Type t = typeof(T);
            var props = t.GetProperties();
            foreach (var p in props)
            {
                try
                {
                    var o = p.GetValue(from, null);
                    p.SetValue(to, o, null);
                }
                catch
                {
                }
            }
        }
    }
5.使用反射+泛型方法后的CustomerDAL.cs内容如下:
    class CustomerDAL
    {
        internal static void Add(HIS_Customers cust)
        {
            var db = DB.db;
            var mid = db.ExecuteQuery<int>("select isnull(MAX(id),0) from HIS_Customers").ToList()[0] + 1;
            cust.id = mid;
            db.HIS_Customers.InsertOnSubmit(cust);
            db.SubmitChanges();
        }
        internal static void Update(HIS_Customers cust)
        {
            var db = DB.db;
            var old = db.HIS_Customers.Single(d => d.id == cust.id);
            DB.CopyValue<HIS_Customers>(cust, old);
            db.SubmitChanges();
        }
        internal static void Delete(int id)
        {
            var db = DB.db;
            var old = db.HIS_Customers.Single(d => d.id == id);
            db.HIS_Customers.DeleteOnSubmit(old);
            db.SubmitChanges();
        }
        internal static List<HIS_Customers> FindAll()
        {
            return DB.db.HIS_Customers.ToList();
        }
    }
 
最核心就是这一行:
 DB.CopyValue<HIS_Customers>(cust, old);
简化了数据修改处理!
Tags:  什么是泛型 java泛型 linq修改 泛型反射 泛型linq

延伸阅读

最新评论

发表评论