2011-02-24 71 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。