网站导航免费论文 原创论文 论文搜索 原创论文 网学软件 学术大家 资料中心 会员中心 问题解答 原创论文 论文素材 设计下载 最新论文 下载排行 论文上传 在线投稿 联系我们
返回网学首页
网学联系
最新论文 推荐专题 热门论文 素材专题
当前位置: 网学 > 编程文档 > C# > 正文
扩展LINQ to SQL以支持批量删除
来源:Http://myeducs.cn 联系QQ:点击这里给我发消息 作者: 用户投稿 来源: 网络 发布时间: 12/10/14
下载{$ArticleTitle}原创论文样式

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

  • 上一篇资讯: WCF基础知识问与答
  • 下一篇资讯: .NET开发手记
  • 网学推荐

    免费论文

    原创论文

    浏览:
    设为首页 | 加入收藏 | 论文首页 | 论文专题 | 设计下载 | 网学软件 | 论文模板 | 论文资源 | 程序设计 | 关于网学 | 站内搜索 | 网学留言 | 友情链接 | 资料中心
    版权所有 QQ:3710167 邮箱:3710167@qq.com 网学网 [Myeducs.cn] 您电脑的分辨率是 像素
    Copyright 2008-2015 myeducs.Cn www.myeducs.Cn All Rights Reserved
    湘ICP备09003080号