在ef各版本中,沒有相應批量的新增,刪除,修改,在用orm 處理資料時直有個尷尬。在網上,也接到了很多網友的詢問這方面的情況,特此今天把這方面的相關擴充套件分享一下,(這裡只做批量刪除的例子,新增和修改的思路雷同)
一、原由
在先前的sql操作中,我們要
update table set cl=1 where id>5 and id<100delete from table where id>5 and id<100
但是在ef中沒有提供相應的介面,我們只能這樣
//批量刪除foreach(var user in context.table.where(u => u.id>5 and id<100).tolist())
本來一句sql可以解決的問題,現在變得複雜了。
二,擴充套件思路
雖然ef沒有提供的介面中,不過我們可以進行乙個擴充套件(ef裡面是指定自己sql語句 context.database.executesqlcommand(sql,args)),思路是這樣的
通過ef擴充套件 生成 sql語句 讓ef來執行sql
三,具體實現**(自己擴充套件的實現,具體看原始碼)
1.應用**
dbdb = new db();db.remove(u => u.id>5 and id<100);
2.**分析
dbdb = new db();//這例項化乙個context類,這類裡封裝了ef方法及擴充套件
db.remove(u => u.id>5 and id<100);//這裡主要執行了三個操作,1.確認是哪個表,2,lambda生成sql,這裡用到了conditionbuilder類,partialevaluator類來解析成sql
以上是partialevaluator裡的部分解析**
publicvoid
build(expression expression)
protected
override
expression visitbinary(binaryexpression b)
this
.visit(b.left);
this
.visit(b.right);
string right = this
.m_conditionparts.pop();
string left = this
.m_conditionparts.pop();
string condition = string.format("
( )
", left, opr, right);
this
.m_conditionparts.push(condition);
return
b; }
protected
override
expression visitconstant(constantexpression c)
}}", this.m_arguments.count - 1
));
return
c; }
protected
override
expression visitmemberaccess(memberexpression m)
]", propertyinfo.name));
return
m; }
3.組裝sql
//////刪除擴充套件[優化刪除]
/// public
static
int deleteentity(this efdbcontextcontext, expressionbool>> predicate) where entity : class
,ientity
public
static commsql getdeletesql(this efdbcontextcontext, expressionbool>> predicate, bool isfag) where entity : class
,ientity
}if (args.count() > 0
)
commsql cmd = new
commsql();
cmd.text =commtext;
if(isfag)
cmd.comnum =context.database.executesqlcommand(com.text, com.args);
return
cmd;
}private
static command getcommands(expressionbool>> predicate) where entity : class
,ientity
;}
以上只是部分**,詳細看擴充套件**及實現例子
Mybatis SQL實現批量新增,修改,刪除紀要
mybatis實現批量新增,修改,刪除?背景 基礎的操作往往經常用到,時常會除錯,為了以後使用方便,特此紀要.說明 主要是對foreach,trim等標籤的應用.是完成上述操作的重心.問題 mybatis如何實現sql處理批量新增,修改,刪除?前情提要 首先了解一下foreach和trim都有那些屬...
mybatis批量修改,批量新增
mybatis批量修改 批量新增sql語句 1 單個新增 insert into t user user name,mobile values 2 新增並返回主鍵 keyproperty的屬性是要返回的主鍵欄位的名稱 insert into t user user name,mobile value...
hibernate批量修改,批量刪除
在hibernate應用中如何處理批量更新和批量刪除?批量更新是指在乙個事務中更新大批量資料,批量刪除是指在乙個事務中刪除大批量資料。以下程式直接通過hibernate api批量更新customers表中年齡大於零的所有記錄的age欄位 tx session.begintransaction it...