InfoQ

新闻

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

作者 朱永光 发布于 2008年4月1日 下午12时9分

社区
.NET
主题
数据访问,
.NET框架
标签
C#,
LINQ,
.NET Framework Programming

最近,博客园的老赵在其博客上发表了一篇博客文章,其中谈到了一种扩展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带来的好处,又能实现一些更复杂的功能。

深度内容

和Google互补的搜索引擎Wolfram|Alpha

Wolfram|Alpha与Google究竟是什么关系,Wolfram|Alpha自己是如何定位的?Wolfram|Alaph在多大程度上是语义网搜索呢?InfoQ中文站就等等这些问题采访了Wolfram研究公司中国区商务经理王翔。

SOA契约成熟度模型

本文说明了所推荐的契约版本管理设计策略是如何与SOA成熟度模型发生联系的。文章目的是为实现版本管理和可组合性提供一个路线图。

数据服务简介

Vijay Narayanan在这篇文章中对数据服务的几个方面进行了介绍,它们都是SOA实践者和数据架构师感兴趣的内容。本文对数据服务的几个方面进行了介绍,包括需求定义,基本原理和好处、范围、开发以及消费模式。

分块云计算

在本文中,Jimmy Nilsson描述了一种他在过去数年间观察到的一种正在缓慢成长的架构风格,他把这种风格称为“分块云计算”。

豆瓣网技术架构变迁

罗马不是一天建成的,豆瓣的技术架构也是随着用户规模的增长一直在持续变化中。在本次演讲中,豆瓣的首席架构师洪强宁将与大家一起分享从上线时的单台服务器架构开始一直到现在的豆瓣架构变迁历程。

融合思想:深入探索S#arp架构

Billy McCafferty展示了S#arp架构,它在ASP.NET MVC框架的基础上,荟萃了当今的最佳实践,应用在ASP.NET Web应用程序的架构设计中。

王雷谈开源以及新兴市场计划

中国作为新兴市场中的新兴市场,是Sun在美国之外实施SSE(SUN Startup Essentials)项目重点关注的地区。在QCon Beijing 2009期间,InfoQ中文站有幸对此项目的负责人王雷先生进行了采访,探讨了关于开源、新兴市场、SSE等话题。

使用HTML5构建下一代的Web Form

HTML5 是由 WHATWG发起的,最开始的名称叫做Web Application 1.0,而后这个标准吸纳了Web Forms 2.0的标准,并一同被W3C组织所采用,合并成为下一代的HTML5标准。