All articles| All Pictures| All Softwares| All Video| Go home page| Write articles| Upload pictures

Reading number is top 10 articles
《Effective,C#》:值类型和引用类型_[Asp.Net教程]
从多个位置截取字符串的SQL语句_[SQL Server教程]
详细讲解PHP中缓存技术的应用_php资料_编程技术
[delphi语法3]布尔类型的使用方法
让Asp.NET的DataGrid可排序、可选择、可分页_[Asp.Net教程]
ASP.NET,中公有的六种验证控件_[Asp.Net教程]
《Effective,C#》之用委托实现回调_.net资料_编程技术
PHP结合MySQL初级网站编程教程_[PHP教程]
PHP和JS实现普通HTTP上安全地传输密码_[PHP教程]
用javascript实现(页面正在加载的效果)_JavaScript技术_编程技术
Reading number is top 10 pictures
乳娘帕梅拉安德森5
NeedWallpaper4
Men's and women's orgasms
30 beautiful school beauty6
移民小国也实惠2
穷哥们向美女求婚攻略
星星命名法则
2013中国四川省高考作文
Beautiful vacuum girl2
移民小国也实惠1
Download software ranking
Unix video tutorial15
Tram sex maniac 2 (H) rar bag8
SP3 for SQL2000
Sora aoi, the nurse, uniform ,nursing assistant
Photoshop 8.0图象编辑软件
dreamweaver8中文版
都市狐狸姑娘传
塘西风月痕
Unix video tutorial7
Macromedia Dreamweaver 8
归海一刀 published in(发表于) 2014/1/30 1:10:34 Edit(编辑)
扩展LINQ,to,SQL:使用Lambda,Expression批量删除数据_[Asp.Net教程]

扩展LINQ,to,SQL:使用Lambda,Expression批量删除数据_[Asp.Net教程]

扩展LINQ to SQL:使用Lambda Expression批量删除数据_[Asp.Net教程]

 ORM框架在删除数据方面一直有个尴尬,那就是无法通过指定条件批量删除数据(当然这本不是ORM的问题,只是使用上感觉不方便)。于是对于一些删除操作,我们不得不写SQL语句或者执行存储过程,例如:

ItemDataContext db = new ItemDataContext();
db.ExecuteCommand(
"DELETE FROM Item WHERE [CreateTime] < {0}",
DateTime.UtcNow.AddMonths(-1));


  我始终认为,在程序里出现直接的SQL语句是一件很丑陋的事情。在我看来,数据库操作应该被封装起来,而对于应用层的开发人员来说,眼中应该只有对象——退一步的话也可向数据库发送指令(就是使用存储过程)。当然,这是理想状态,值得追求,但不可强求。幸运的是C# 3.0所拥有的强大特性足以让我们对LINQ to SQL的功能进行扩展。为了更好地进行项目开发,以及周五的一次技术交流,我为LINQ to SQL扩展了批量删除功能。当项目中引用了这个扩展之后,我们就可以使用如下的代码来实现上面的功能了:


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");


  之前我对于LINQ to SQL的扩展大都基于DataContext,不过很明显,这次的扩展是基于Table的。总的来说,这个扩展比我想象中要简单不少。针对LINQ的扩展最麻烦的地方就在于解析表达式树(Expression Tree),而这个扩展关键的就是二元表达式(BinaryExpression),除了这点就没有太大问题了——当然,这也是因为我放弃了对于复杂表达式树的解析,例如现在就不支持“item.Introduction.Length < 10”这种条件,而对于更完整的解析方式来说,应该将其转化为T-SQL中的LEN函数。


  这个扩展的关键在于根据表达式树生成Where Condition,我使用三个步骤完成这个扩展,大家可以关注代码里的相关实现(如果需要的话我也可以在以后进行说明):



  1. 使用PartialEvaluator将表达式中的常量直接计算出来(例如“3 * 3”表达式将被替换为“9”),同时也会将一些存储在变量中的值使用常量进行替换。
  2. 使用ConditionBuilder将表达式中的常量收集起来,并生成带参数的Condition表达式(例如“[CreateTime] < {0} AND [UserName] <> {1}”)。
  3. 使用DataContext.ExecuteCommand方法执行完整的SQL语句。

  有了批量删除的功能,那么还缺点什么呢?那自然就是批量更新的功能了。批量更新的功能比删除略为复杂一些,我正在开发之中。在有了这个扩展之后,我们就可以使用如下的方法进行批量更新了:


ItemDataContext db = new ItemDataContext();
db.Items.Update(
item => new Item
{
Introduction = item.Title + "Hello World",
ViewCount = item.ViewCount + 1,
}, // 更新方式
item => item.CommentCount > 100 /* 更新条件 */);


  您可以点击这里下载我对批量删除的扩展。


来源:http://www.cnblogs.com/JeffreyZhao







添加到del.icio.us 添加到新浪ViVi 添加到百度搜藏 添加到POCO网摘 添加到天天网摘365Key 添加到和讯网摘 添加到天极网摘 添加到黑米书签 添加到QQ书签 添加到雅虎收藏 添加到奇客发现 diigo it 添加到饭否 添加到飞豆订阅 添加到抓虾收藏 添加到鲜果订阅 digg it 貼到funP 添加到有道阅读 Live Favorites 添加到Newsvine 打印本页 用Email发送本页 在Facebook上分享


Disclaimer Privacy Policy About us Site Map

If you have any requirements, please contact webmaster。(如果有什么要求,请联系站长)
Copyright ©2011-
uuhomepage.com, Inc. All rights reserved.