如何使用LinQ to NHibernate有效删除数据库中的数据(一次删除)

时间:2011-01-17 09:50:49

标签: sql nhibernate linq-to-nhibernate

为客户生产软件,主要是使用MS SQL但是使用某些Oracle,决定投入Nhibernate(和C#)。

任务是有效删除,例如10万行从10万行仍然坚持ORM。

我已经尝试了named queries - link

  

IQuery sql = s.GetNamedQuery(" native-delete-car")。SetString(0," Kirsten");
          sql.ExecuteUpdate();

但我发现的最好的似乎是:

 using (ITransaction tx = _session.BeginTransaction())
        {
            try
            {
                string cmd = "delete from Customer where Id < GetSomeId()";

                var count = _session.CreateSQLQuery(cmd).ExecuteUpdate();
                ...

因为在删除它们之前可能无法获得所有完整的行。

我的问题是:

如果有更好的方式进行此类删除。

如果有可能像这样得到删除的Where条件:
有一个select语句(使用LinQ to NHibernate)=&gt;这将为DB =&gt;生成适当的SQL我们得到Where条件并将其用于删除。

3 个答案:

答案 0 :(得分:1)

  

如果有更好的方式进行此类删除。

是的,你可以use HQL instead of SQL

  

如果有可能获得删除的Where条件[使用表达式]:

不,AFAIK没有实施。由于NHibernate是一个开源项目,我建议您find out if anyone has proposed this和/或discuss it on the mailing list

答案 1 :(得分:0)

感谢您的快速回复。现在我可能已经有所不同了。

session.CreateSQLQuery(cmd).ExecuteUpdate();

必须包含“从DbTable删除”的cmd。相反,HQL方式

session.CreateQuery(cmd).ExecuteUpdate();

需要使用从MappedCollectionOfObjects删除的cmd。

在这种情况下,它可能也解决了我的另一个问题。

答案 2 :(得分:0)

NHibernate 5.0现在有更好的方法:

var biggestId = GetSomeId();
session.Query<Customer>()
            .Where(c => c.Id < biggestId)
            .Delete();

文档:

    //
    // Summary:
    //     Delete all entities selected by the specified query. The delete operation is
    //     performed in the database without reading the entities out of it.
    //
    // Parameters:
    //   source:
    //     The query matching the entities to delete.
    //
    // Type parameters:
    //   TSource:
    //     The type of the elements of source.
    //
    // Returns:
    //     The number of deleted entities.
    public static int Delete<TSource>(this IQueryable<TSource> source);