您的位置:首页 > 博客中心 > 数据库 >

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

热门排行

今日推荐

热门手游