linq,网上已经有很多讨论这个东西的文章,说好的说不好的比比皆是。
在这儿我只说自己的观点,我觉得linq最大的好处就是继承了一种思想,那就是对所有不同格式数据源的统一访问标准。
一种技术出来总是很快会被新技术代替,只有思想会延续比较长的时间,甚至可能影响更新换代。个人感觉linq就是一种很
好的思想,不知道其他的像java这样的框架在以后会不会借鉴这种思想,但是我预测在不久的将来我们一定能够看到在非微软
的框架中看到这种思想的衍生物。
好了,回到今天的主题。今天的主题还是技术方面的小技巧,就是linq to sql的一个泛化模板。
我们在使用linq to sql 的时候,会发现对于每一个数据库实体对象的增删改查都要写很多相类似的代码。虽然这些代码并
不是很多,但是对于习惯于重用的我们来说,总是写相似的代码还是有些小不爽的。.net中提供了一个很好的工具就是泛化,用
来实现算法级别的重用(区别于继承是代码级别的重用),在下面我就会用泛化来实现一个linq to sql 的模板类,使用这个模板
,对于简单的单实体对象的简单的增删改查是可以实现的。但是对于很复杂的linq操作,可以继承自该类然后再实现自己的方法,
不过个人意见,如果数据库的操作相当复杂的话,建议选用的数据库访问工具是ado.net 而不是 linq to sql。这纯粹只是个人
意见,仅供探讨。
下面来看具体的代码:
public class Base<T> where T:class
{
public DataClasses1DataContext db { get; set; }
public Base()
{
db = new DataClasses1DataContext();
}
/// <summary>
/// generic method for insert
/// </summary>
/// <typeparam name="T">DB Entity</typeparam>
/// <param name="entity">the entity for insert</param>
public void Insert<T>(T entity)
{
db.GetTable(entity.GetType()).InsertOnSubmit(entity);
db.SubmitChanges();
}
/// <summary>
/// generic method for query
/// </summary>
/// <param name="match">DB Entity</param>
/// <returns>the result that return by query in DB using lamda</returns>
public IEnumerable<T> Query(Func<T, bool> match)
{
return db.GetTable<T>().Where(match);
}
/// <summary>
/// generic method for delete
/// </summary>
/// <typeparam name="T">DB Entity</typeparam>
/// <param name="entity">the entity for delete</param>
public void Delete<T>(T entity)
{
db.GetTable(entity.GetType()).DeleteOnSubmit(entity);
db.SubmitChanges();
}
/// <summary>
/// generic method for update
/// </summary>
/// <typeparam name="T">DB Entity</typeparam>
/// <param name="entity">the entity for updage</param>
public void Update<T>(T entity)
{
//the two line below looks like first delete and then insert
//the new entity in database is not really update
//but actually .net optimize them and translate them into
//an update sql expression
db.GetTable(entity.GetType()).DeleteOnSubmit(entity);
db.GetTable(entity.GetType()).InsertOnSubmit(entity);
db.SubmitChanges();
}
}
And then show how to use it:
Base<Education> b = new Base<Education>();
Education a = new Education
{
Name="gkfdddedddd",
};
b.Insert(a);
var es = b.Query(E => E.Name == "1234d9");
foreach (Education ee in es)
{
ee.Name = "12349";
b.Update(ee);
b.Delete(ee);
}
以上的代码实现比较简单,应该不会造成理解上的问题,有兴趣探讨的(不仅仅是这些代码,还可以是linq 相关的其他方面)可以发信给我:
zhaotiantang520@live.cn ,msn:zhaotiantang520@live.cn