在EF各版本中,没有相应批量的添加,删除,修改,在用ORM 处理数据时直有个尴尬。在网上,也接到了很多网友的询问这方面的情况,特此今天把这方面的相关扩展分享一下,(这里只做批量删除的例子,添加和修改的思路雷同)

一、原由

在先前的SQL操作中,我们要

update table set  cl=1 where  id>5 and id<100

delete from table where  id>5 and id<100

但是在EF中没有提供相应的接口,我们只能这样

//批量删除
foreach(var user in context.table.Where(u => u.id>5 and id<100).ToList())
{
context.Remove(user);
}

本来一句sql可以解决的问题,现在变得复杂了。

二,扩展思路

虽然EF没有提供的接口中,不过我们可以进行一个扩展(EF里面是指定自己SQL语句 context.Database.ExecuteSqlCommand(sql,args)),思路是这样的

通过EF扩展 生成 SQL语句 让EF来执行SQL

三,具体实现代码(自己扩展的实现,具体看源码)

1.应用代码

     DB<MdStudent> db = new DB<MdStudent>();
db.Remove(u => u.id> and id<);

2.代码分析
     DB<MdStudent> db = new DB<MdStudent>();//这实例化一个context类,这类里封装了EF方法及扩展

db.Remove(u => u.id> and id<);//这里主要执行了三个操作,1.确认是哪个表,2,Lambda生成SQL,这里用到了ConditionBuilder类,PartialEvaluator类来解析成SQL

以上是PartialEvaluator里的部分解析代码

        public void Build(Expression expression)
{
PartialEvaluator evaluator = new PartialEvaluator();
Expression evaluatedExpression = evaluator.Eval(expression); this.m_arguments = new List<object>();
this.m_conditionParts = new Stack<string>(); this.Visit(evaluatedExpression); this.Arguments = this.m_arguments.ToArray();
this.Condition = this.m_conditionParts.Count > ? this.m_conditionParts.Pop() : null;
} protected override Expression VisitBinary(BinaryExpression b)
{
if (b == null) return b; string opr;
switch (b.NodeType)
{
case ExpressionType.Equal:
opr = "=";
break;
case ExpressionType.NotEqual:
opr = "<>";
break;
case ExpressionType.GreaterThan:
opr = ">";
break;
case ExpressionType.GreaterThanOrEqual:
opr = ">=";
break;
case ExpressionType.LessThan:
opr = "<";
break;
case ExpressionType.LessThanOrEqual:
opr = "<=";
break;
case ExpressionType.AndAlso:
opr = "AND";
break;
case ExpressionType.OrElse:
opr = "OR";
break;
case ExpressionType.Add:
opr = "+";
break;
case ExpressionType.Subtract:
opr = "-";
break;
case ExpressionType.Multiply:
opr = "*";
break;
case ExpressionType.Divide:
opr = "/";
break;
default:
throw new NotSupportedException(b.NodeType + "is not supported.");
}
this.Visit(b.Left);
this.Visit(b.Right);
string right = this.m_conditionParts.Pop();
string left = this.m_conditionParts.Pop();
string condition = String.Format("({0} {1} {2})", left, opr, right);
this.m_conditionParts.Push(condition);
return b;
} protected override Expression VisitConstant(ConstantExpression c)
{
if (c == null) return c;
this.m_arguments.Add(c.Value);
this.m_conditionParts.Push(String.Format("{{{0}}}", this.m_arguments.Count - ));
return c;
}
protected override Expression VisitMemberAccess(MemberExpression m)
{
if (m == null) return m;
PropertyInfo propertyInfo = m.Member as PropertyInfo;
if (propertyInfo == null) return m;
this.m_conditionParts.Push(String.Format("[{0}]", propertyInfo.Name));
return m;
}

3.组装SQL

 /// <summary>
/// 删除扩展[优化删除]
/// </summary>
public static int DeleteEntity<Entity>(this EFDbContext<Entity> Context, Expression<Func<Entity, bool>> Predicate) where Entity : class,IEntity
{
Command cmd = GetCommands<Entity>(Predicate);
int Result = Context.Database.ExecuteSqlCommand(cmd.Text, cmd.args);
return Result;
}
public static CommSql GetDeleteSql<Entity>(this EFDbContext<Entity> Context, Expression<Func<Entity, bool>> Predicate, bool IsFag) where Entity : class,IEntity
{
Command com = GetCommands<Entity>(Predicate);
string CommText = com.Text;
object[] args = com.args;
for (int j = ; j < args.Count(); j++)
{
if (!(args[j].GetType() != "Type".GetType()))
{
args[j] = "'" + args[j] + "'";
}
}
if (args.Count() > )
{
CommText = string.Format(CommText, args);
}
CommSql cmd = new CommSql();
cmd.Text = CommText;
if (IsFag)
cmd.ComNum = Context.Database.ExecuteSqlCommand(com.Text, com.args);
return cmd;
}
private static Command GetCommands<Entity>(Expression<Func<Entity, bool>> Predicate) where Entity : class,IEntity
{
//根据条件表达式转换成SQL的条件语句
ConditionBuilder Builder = new ConditionBuilder();
Builder.Build(Predicate.Body);
string sqlCondition = Builder.Condition;
//获取SQL参数数组
string Table = Operate.getTableName<Entity>();
string CommText = "Delete From [" + Table + "] Where " + sqlCondition;
var args = Builder.Arguments;
return new Command() { Text = CommText, args = args };
}

以上只是部分代码,详细看扩展代码及实现例子 http://files.cnblogs.com/gzalrj/EF5.rar

EF批量添加,删除,修改的扩展的更多相关文章

  1. Entity Framework入门教程(12)--- EF进行批量添加/删除

    EF6添加了批量添加/删除实体集合的方法,我们可以使用DbSet.AddRange()方法将实体集合添加到上下文,同时实体集合中的每一个实体的状态都标记为Added,在执行SaveChange()方法 ...

  2. MyBatis通过注解方式批量添加、修改、删除

    唯能极于情,故能极于剑 注: 本文转载于:CodeCow · 程序牛 的个人博客:http://www.codecow.cn/ 一.数据库实体DO public class User implemen ...

  3. IIS环境下如何批量添加、修改、删除绑定的域名

    IIS环境下如何批量添加和修改所绑定域名 1.关闭IISADMIN服务和W3SVC服务,可以从服务里面关闭,也可以直接执行命令:net stop iisadmin /y: 2.打开“C:\WINDOW ...

  4. EF批量添加数据性能慢的问题的解决方案

    //EF批量添加数据性能慢的问题的解决方案 public ActionResult BatchAdd() { using (var db = new ToneRoad.CEA.DbContext.Db ...

  5. SQL语句添加删除修改字段及一些表与字段的基本操作

    用SQL语句添加删除修改字段 1.增加字段     alter table docdsp    add dspcode char(200)2.删除字段     ALTER TABLE table_NA ...

  6. Entity framework 绑定到Datagridview的添加删除修改

    Entity framework 绑定到Datagridview的添加删除修改 using System; using System.Collections.Generic; using System ...

  7. JavaScript学习 - 基础(八) - DOM 节点 添加/删除/修改/属性值操作

    html代码: <!--添加/删除/修改 --> <div id="a1"> <button id="a2" onclick=&q ...

  8. JTree 添加 , 删除, 修改

    package com.swing.demo; import java.awt.BorderLayout; import java.awt.Container; import java.awt.eve ...

  9. 用SQL语句添加删除修改字段、一些表与字段的基本操作、数据库备份等

    用SQL语句添加删除修改字段 1.增加字段 alter table docdsp add dspcode char(200) 2.删除字段 ALTER TABLE table_NAME DROP CO ...

  10. SQL语句添加删除修改字段[sql server 2000/2005]

    用SQL语句添加删除修改字段1.增加字段     alter table docdsp    add dspcodechar(200)2.删除字段     ALTER TABLE table_NAME ...

随机推荐

  1. Collapsing Margin:外边距叠加

    参考:http://www.smallni.com/collapsing-margin/ http://www.cnblogs.com/v10258/p/3530290.html

  2. 利用PHPExcel导出Excel相关设置

    功能包括: 1.设置单元格格式,包括单元格边框.单元格高度.单元格宽度 2.合并指定的单元格 3.设置Excel数据源,并将数据源保护起来(这个是为了实现单元格下拉选项功能) 4.设置字体样式 pub ...

  3. 微服务 通过EnableFeignClients调用其他服务的api

    今天在项目上遇到一个问题,通过当前service服务要调用到其他service服务的api接口时,可通过EnableFeignClients调用其他服务的api,大概的步骤如下: 1.在springb ...

  4. ASP.NET动态添加用户控件的方法

    本文实例讲述了ASP.NET动态添加用户控件的方法.分享给大家供大家参考.具体实现方法如下: 为了让用户控件能ASP.NET页面实现动态添加,首先写一个接口IGetUCable,这个接口有一个函数,返 ...

  5. Supervisor安装与配置(非守护进程管理工具)

    http://blog.csdn.net/xyang81/article/details/51555473

  6. break、continue、return之间的区别与联系

    今天在部署程序的时候,监控日志发现这个问题了.return的问题就这么总结哈. 在软件开发过程中,逻辑清晰是非常之重要的. 代码的规范也是非常重要的.往往细节决定成败.在编写代码的时候,一定要理解语言 ...

  7. 改进动态设置query cache导致额外锁开销的问题分析及解决方法-mysql 5.5 以上版本

    改进动态设置query cache导致额外锁开销的问题分析及解决方法 关键字:dynamic switch for query cache,  lock overhead for query cach ...

  8. FastCGI中fastcgi_param 详细说明

    fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name;#脚本文件请求的路径 fastcgi_param  QUERY ...

  9. js里面函数的内部属性

    1.arguments用來存放传输参数的集合,可以被调用多次,每次数組都不一样,增强了函数的强壮性 实例: function calc() { var sum = 0; /*参数为一个时候*/ if ...

  10. 使用NSTimer实现动画

    1.新建empty AppLication,添加HomeViewController页面, iphone.png图片 2.在 HomeViewController.xib中添加Image View,并 ...