2011-02-24 51 views
1

哪個ORM支持SQL像批量插入/更新/刪除:哪個.Net ORM支持sql如批量插入/更新/刪除?

var user=new UserInfoFields(); 
var update=user.Update().Set 
(
    user.Field1=1, 
    user.Field2="xxxx" 
).Where(user.Name=="Jim" && user.Enable==true); 

update.Excute(); 

相應的T-SQL是:

UPDATE UserInfo 
SET 
    Field1=1, 
    Field2="xxxx" 
WHERE Name='Jim' and Enable=1 
+4

(大多數,如果不是全部的話)ORM的**不是**被設計來處理批量操作。如果你想批量操作,使用合適的批量組件,或者直接在你的數據庫中執行(例如使用存儲的proc或類似的東西) – 2011-02-24 15:24:56

+0

@marc_s:謝謝你的回答。我同意你關於ORM不是爲了處理批量操作而設計的,但是如果我們需要支持多種類型的數據庫,這種方式是非常有用的。我發現LLBLgen支持像這樣的操作,但是他的API不流利。 – guaike 2011-02-24 15:36:18

+0

是的,這很方便 - 而且很好的做法。對於這些情況,我通常建議將函數封裝到存儲過程中,並從您的ORM執行該存儲過程(例如'DataContext' for Linq-to-SQL或類似方法) – 2011-02-24 15:37:54

回答

1

PHP的ActiveRecord有這樣的事情,但是這是PHP。 Linq2SQL可以被擴展來執行更簡單的批量更新/刪除,但它不是「庫存」行爲。以下是有關該主題的文章的鏈接:http://www.aneyfamily.com/terryandann/post/2008/04/Batch-Updates-and-Deletes-with-LINQ-to-SQL.aspx。我知道一個事實,即NHibernate沒有像這樣內置的東西,但同樣,你可以擴展Linq提供程序,NH也允許HQL和SQL查詢作爲字符串,包括批量更新/刪除(只有問題是它們是「魔術字符串「這不是編譯器檢查)。

這種行爲確實違背了ORM設計的目的。 ORM的存在不是爲所有可能的SQL操作提供編譯器檢查的查詢,而是爲單個對象實例的CRUD操作提供「黑盒子」封裝邏輯,例如,將對象的請求轉變爲SQL以檢索必要的數據並水合物體。批量和批量操作無論如何都不是他們的特長。

+0

http://ayende.com/Blog/2006/09/16/BatchingSupportInNHibernate.aspx - 您不需要使用HQL或SQL查詢在NHibernate中進行批處理。你可以選擇一堆對象,修改它們並用LINQ批量處理。 – Phill 2011-02-24 15:36:44

+0

你描述的行爲改變了NHibernate向服務器發送單個插入/更新/刪除請求的方式;它不提供OP中描述的「批量更新」Linq功能。NH將簡單地緩存單個對象上的會話更新,直到它具有所需的批處理大小或刷新會話,然後將它們全部通過單個複合命令發送出去。它減少了往返次數,而不是查詢次數;每個命令仍然對一個對象進行操作(顯而易見的例外是對討論不重要的選擇查詢)。 – KeithS 2011-02-24 15:55:02

+0

下面是Ayende博客文章的工作鏈接:http://ayende.com/blog/1686/batching-support-in-nhibernate – friism 2011-12-25 16:30:00

5

結帳BLToolkit - >BLToolkit Linq Extensions - Update

db.Employee 
    .Where(e => e.Title == "Spectre") 
    .Update(e => new Northwind.Employee 
    { 
     Title = "Commander" 
    }); 

db.Employee 
    .Where(e => e.Title == "Spectre") 
    .Set(e => e.Title, "Commander") 
    .Update(); 

=

UPDATE 
    [e] 
SET 
    [Title] = 'Commander' 
FROM 
    [Employees] [e] 
WHERE 
    [e].[Title] = 'Spectre' 

使用它的2 - 3年了,現在和它的偉大:d

首先閱讀這個雖然 - > High Level Vision, Global Architecture Strategy & Concept Model Design

+0

謝謝!這是我最想要的效果。 – guaike 2011-03-07 14:23:18

+0

Downvoting,因爲該域不再有效。可能不是一個好的工具,因爲它不被維護。 – 2015-09-01 19:58:48

0

大多數我知道缺少批量更新功能,如果你喜歡用EnityFramework工作像我一樣,你可以使用Entity Framework Extended Library至極延伸後的EntityFramework許多功能,包括批量更新和刪除和查詢Futre的的ORM。