我可以更新用db.ExecuteQuery()检索到的LINQ-to-SQL记录吗?

本文关键字:LINQ-to-SQL 记录 检索 更新 db ExecuteQuery 我可以 | 更新日期: 2023-09-27 18:03:01

我的查询是从app.config动态检索的。我知道某些栏目将被包括在内。我想在处理后返回的每条记录中更新一列。我可以用.SubmitChanges()或类似的方法做到这一点吗?或者我必须用更新sql编写另一个db.ExecuteQuery() ?

DataClasses1DataContext db = new DataClasses1DataContext();
IEnumerable<invoice> invoices = db.ExecuteQuery<invoice>(ConfigurationManager.AppSettings["query_sql"].ToString());
foreach (invoice i in invoices)
{
    // do something with the invoice
    // flag the invoice as processed
    i.doc_processed = "Y";
    db.SubmitChanges();
}

感谢madd0的回答,我重新设计了我的应用程序允许动态SQL的方式。应用程序查找具有特定名称的SQL视图,而不是在app.config中输入查询。这样可以添加视图,LINQ将自动生成类型/类,并允许使用.SubmiteChanges()

我可以更新用db.ExecuteQuery()检索到的LINQ-to-SQL记录吗?

跟踪/更新。

为了使用SubmitChanges来更新您的实体,Linq to Sql必须能够跟踪它们。要做到这一点,最简单的方法是允许Linq生成你的类型(或者,你也可以用一堆属性来修饰poco)

如果您的invoice类型没有生成,以便Linq to Sql可以跟踪它,那么DataContext将不可能确定哪些对象已经更改,并在调用SubmitChanges时生成适当的UPDATE语句。

如果您使用跟踪实体,并且ObjectTrackingEnabled设置为true,但希望使用ExecuteQuery<T>而不是让Linq to Sql生成您的查询,您仍然必须确保您的SELECT命令返回所有跟踪字段,并且您的表具有主键(这在ExecuteQuery<T>的文档中解释)。

最后,正如我在最初的回答中解释的那样,您总是可以用ExecuteCommand手动执行UPDATE查询。这就是我做大多数更新的方式,因为它在大多数情况下更有效,特别是在更新大量实体时,因为Linq to SQL将在使用SubmitChanges时为每个更新的记录在服务器上执行单独的UPDATE命令,而如果你手工做的话,你很可能能够将其写为单个命令。

如果您决定创建自己的UPDATE语句并使用ExecuteCommand执行它们,请记住使用参数not使用连接来这样做,以限制SQL注入攻击。参数化查询的示例可在ExecuteCommand的文档中找到。

还是要看情况。

在你的例子中,它取决于//对发票做点什么。如果您无论如何都要触摸该部分中每个发票的许多字段,则此代码是可以的。除了可以将提交更改移到循环之外:

  foreach (invoice i in invoices)
    {
        // do something with the invoice
        // flag the invoice as processed
        i.doc_processed = "Y";
    }
 db.SubmitChanges();

所以你将获得单个事务的好处(尽管仍然有多个更新,所以在大量发票的性能方面,它将不是最好的)。

如果//do某事相对简单,我会在查询中编写整个//do某事逻辑,并在sql中执行,有效地将代码减少到

db.ExecuteQuery<invoice>(ConfigurationManager.AppSettings["do_something_update_query_sql"].ToString());

这样它将是最高效的,但您不使用Linq2sql的任何ORM部分。