【问题标题】:How to use (.NET and NHibernate - CreateSQLQuery) (disuse of "Foreach")如何使用(.NET 和 NHibernate - CreateSQLQuery)(不使用“Foreach”)
【发布时间】:2015-03-18 07:02:17
【问题描述】:

我在code下用了很久,但我觉得效率低,因为要执行几次。

所以,我想放弃使用“Foreach”和相同的性能。

public void SaveProgramListinsertWithCart(List<ProductDto> insertList)
{
      foreach (ProductDto insertItem in insertList)
      {
             Session.CreateSQLQuery(@"insert into Cart (ProdCode, Qty,  CustId)
                                      values (:prodCode, :qty, :custid)")                
             .SetParameter("prodCode", insertItem.ProdCode, NHibernateUtil.String)
             .SetParameter("qty", insertItem.Qty, NHibernateUtil.Int32)
             .SetParameter("custid", insertItem.CustId, NHibernateUtil.String)
             .List();
      }                    
}

【问题讨论】:

    标签: c# sql nhibernate foreach


    【解决方案1】:

    要使用CreateSQLQuery 执行插入/更新,您必须调用ExecuteUpdate 方法,例如:

    foreach (ProductDto insertItem in insertList)
    {
        var query = Session.CreateSQLQuery(@"insert into Cart (ProdCode, Qty,  CustId)
                                            values (:prodCode, :qty, :custid)")                
                            .SetParameter("prodCode", insertItem.ProdCode, NHibernateUtil.String)
                            .SetParameter("qty", insertItem.Qty, NHibernateUtil.Int32)
                            .SetParameter("custid", insertItem.CustId, NHibernateUtil.String);
    
        int result = query.ExecuteUpdate();
    }     
    

    另一方面,我不认为使用 SQL 执行插入是您可以使用 NHibernate 之类的 ORM 工具执行的最佳方法。我认为最好的方法是将映射对象发布到ISession 实例中,例如:

    foreach (ProductDto insertItem in insertList)
    {
        var product = new Product();
        product.ProdCode = insertItem.ProdCode;
        product.CustId = insertItem.CustId;
        product.Qty = insertItem.Qty;
    
        Session.Save(product);
    }     
    

    【讨论】:

    • 感谢您的回答,但您的代码仍然使用“FOREACH”。
    • 所以,我认为应该连接DB几次。我知道 IO 连接对程序性能有影响。出于这个原因,我真的想删除“FOREACH”。
    • 嗯,您需要为列表中的每个项目发布每个条目,对吗?你需要这个循环。您可以根据需要配置批量大小,但这是另一个线程的问题:)
    • 你真好。要删除循环,我会将 List 发送到 SP...!这样,我期望减少IO连接。但是,我不知道该怎么做。你有什么想法吗?
    • 我认为没有办法做到这一点。您可以将 varchar 发送到 SP 并在其中拆分,但我不确定这是否是最好的方法!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-26
    • 2016-07-23
    相关资源
    最近更新 更多