我可以更新用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()
为了使用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部分。