软件频道>程序开发>JavaVBVCDelphiC/C++Web开发微软专栏移动数据库程序人生软件工程|开发客
您现在的位置: 天极网 > 开发频道 > 扩展LINQ to SQL以支持批量删除
全文

扩展LINQ to SQL以支持批量删除

2008-04-02 09:07作者:infoq 朱永光出处:天极网责任编辑:郑重

  最近,博客园的老赵在其博客上发表了一篇博客文章,其中谈到了一种扩展LINQ to SQL以支持批量删除数据的方法,可以让我们方便地利用Lambda表达式来进行批量删除的操作。

  LINQ to SQL要根据条件批量删除数据,通常的做法都是编写SQL语句,并通过DataContext的ExecuteCommand方法来执行删除操作。这样的方法很直接,但是不够自然,如老赵所说:

  我始终认为,在程序里出现直接的SQL语句是一件很丑陋的事情。在我看来,数据库操作应该被封装起来,而对于应用层的开发人员来说,眼中应该只有对象——退一步的话也可向数据库发送指令(就是使用存储过程)。

  在此之前,老赵也写过类似扩展LINQ to SQL的文章,其利用了LINQ to SQL中Translate方法来修改动态生成的SQL语句。不过,这次对于批量删除的扩展,老赵使用C# 3.0的新特性——扩展方法,来针对System.Data.Linq.Table实现了一个名为Delete的扩展方法,在引用了这个扩展包后,就可以通过如下类似的代码来进行批量删除数据的操作:

  ItemDataContext db = new ItemDataContext();

  db.Items.Delete(item => item.CreateTime < DateTime.UtcNow.AddMonths(-1));

  扩展还支持更复杂的删除条件

  ItemDataContext db = new ItemDataContext();

  db.Items.Delete(item =>

  item.CreateTime < DateTime.UtcNow.AddMonths(-1) ||

  item.ViewCount < item.CommentCount && item.UserName != "jeffz");

  老赵的这种方法,是对Lambda的表达式树进行解析后生成DELETE SQL的Where条件子句。他使用了三个步骤来完成这个解析工作:

  使用PartialEvaluator将表达式中的常量直接计算出来(例如“3 * 3”表达式将被替换为“9”),同时也会将一些存储在变量中的值使用常量进行替换。

  使用ConditionBuilder将表达式中的常量收集起来,并生成带参数的Condition表达式(例如“[CreateTime] < {0} AND [UserName] <> {1}”)。

  使用DataContext.ExecuteCommand方法执行完整的SQL语句。

  而另外一个博主,Black Jack,在老赵文章的提示下,使用了一种“投机取巧”的方式来生成批量删除数据的SQL语句。他的思路是,从Query中获取自动生成的SELECT SQL语句,并将其改造为DELETE SQL语句。改造的时候使用正则表达式来进行查找和替换。关于这种方式的详细做法,可以浏览Linq to Sql: 批量删除之投机取巧版这篇文章。

  对于这种扩展LINQ to SQL以支持批量删除的做法,有些人认为还是直接编写SQL更方便。然而,越来越多的人都在积极尝试扩展LINQ to SQL,这样可以让我们既获得LINQ to SQL带来的好处,又能实现一些更复杂的功能。

相关搜索:
关注此文读者还看过
热门关注
特别推荐
文章排行
本周
本月
最近更新
关于我们|About us|网站律师|天极服务|电子杂志|RSS订阅|加入我们|网站地图
TMG
Copyright (C) 1999-2009 Chinabyte.com, All Rights Reserved 版权所有 天极网络
商务联系、网站内容、合作建议:010-82657868
版权声明 在线提交意见反馈 渝ICP证B2-20030003号
经营性网站备案信息 网警备案 中国网站排名
天极传媒:天极网|比特网|IT专家网|IT商网|52PK游戏网|IT分众