在使用Linq进行数据修改时操作比较麻烦,下面是我的Linq操作常用方法:
1.创建一个Linq To Sql的类,将数据库中数据拖到设计界面中如下图表结构:
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);
简化了数据修改处理!