LINQ To SQL在N层应用程序中的CUD操作、批量删除、批量更新
时间:2022-03-13 22:54
原文:
0. 说明
Linq to Sql,以下简称L2S。
以下文中所指的两层和三层结构,分别如下图所示:
准确的说,这里的分层并不是特别明确:
(1) 生成的DataContext(Linq t0 SQL Runtime)和Entity是放在一个文件中的,物理上不能切割开来;上图只是展示逻辑上的结构。
(2) 拿上图右边的三层结构来说,鉴于第(1)点,UI层就可以跨越BusinessLogic层,直接访问L2S层,这可能不是我们期望的。对于这个问题,可以有如下两种办法:A.建立自己的Entity层(DomainModel,UI与BL之间使用DomainModel,BL将DomainModel转换成L2S的Entity后,再交给L2S Runtime进行数据库更新); B.告诉UI层开发人员不要访问L2S Runtime-,-
1. 生成DataContext和Entity
1.1 使用VS自带的L2S对象关系设计器(O/R设计器)
如果程序很简单只是拿来玩儿的,就少数几个表,可以直接使用此法,将表/视图/存储过程从数据源中拖拽到设计器中即可。但如果系统中的表很多,拖着拖着就把自己给拖晕了……
1.2 使用SqlMeta工具
用法见MSDN。
1.3 手工建立实体定义或者XML映射
太多活要干,如果没有特殊场景必须手工Code这堆东西的话,建议还是省省……
具体可以参考MSDN:
2. 两层应用下的CUD操作
两层应用下的较为简单,MSDN中有例子,借花献佛:
2.1 新增
4. 批量更新、批量删除
然而,上面的处理方式只是处理的最基本的CUD操作,而实际应用中的业务逻辑不会这么简单。如果涉及到稍为复杂点儿的应用,譬如我要根据一个外部传进来的条件,执行批量修改、批量删除,该咋处理呢?
关于批量删除和批量更新,老赵曾提出过自己的方案:,其思路就是实现一个Expression<Func<T, bool>>解析器,并将Expression解析为最终需要执行的TSQL。在老赵的同篇英文博客中,有人在回复中提出了另一个思路,对L2S生成的TSQL进行包装,将其作为Update/Delete语句中的子查询,这样就可以直接复用L2S的查询解析器,使用L2S解析器提供的全部功能了;接下来有人将这个思路进行了实现:。原文作者写的非常详细了,并提供了源代码,可以下载回来学习或者直接复用。
6:
7: UpdateBatch(predicate, evaluator); //批量更新
8: DeleteBatch(predicate); //批量删除
9: MultiSelect(); //批量查询
10: DeleteByPK(productID); //按主键删除
11:
12: public void UpdateBatch(Expression<Func<Products, bool>> predicate,
13: Expression<Func<Products, Products>> evaluator)
14: {
15: using (NorthWindDataContext context = new NorthWindDataContext())
16: {
17: context.Products.UpdateBatch(predicate, evaluator);
18: }
19: }
20:
21: public void DeleteBatch(Expression<Func<Products, bool>> predicate)
22: {
23: using (NorthWindDataContext context = new NorthWindDataContext())
24: {
25: context.Products.DeleteBatch(predicate);
26: }
27: }
28:
29: public void MultiSelect()
30: {
31: using (NorthWindDataContext context = new NorthWindDataContext())
32: {
33: var query1 = (from P in context.Products select P).Take(2);
34: var query2 = (from S in context.Suppliers select S).Take(2);
35: IMultipleResults result = context.SelectMutlipleResults(query1, query2);
36:
37: List<Products> products = result.GetResult<Products>().ToList();
38: List<Suppliers> suppliers = result.GetResult<Suppliers>().ToList();
39: ObjectDumper.Write(products);
40: ObjectDumper.Write(suppliers);
41: }
42: }
43:
44: public void DeleteByPK(int productID)
45: {
46: using (NorthWindDataContext context = new NorthWindDataContext())
47: {
48: context.Products.DeleteByPK(productID);
49: }
50: }
具体生成的SQL,可以用SQL Server Profile来查看。
参考《MSDN》:
1.
2.
3.
4.
LINQ To SQL在N层应用程序中的CUD操作、批量删除、批量更新,布布扣,bubuko.com