c# - 如何在不加载整行的情况下更新 LINQ 中的单个列?

标签 c# linq performance linq-to-sql

在 LinqToSql 中,加载行、更改列并将更改提交到数据库非常容易:

using (MyDataContext wdc = new MyDataContext())
{        
  Article article = wdc.Article.First(p => p.ID == id);
  article.ItemsInStock = itemsinstock;
  wdc.SubmitChanges();
}

唯一的缺点:文章很大。 要加载整篇文章,仅更新一列是多余的,并且会显着降低我的应用程序的速度。

有没有一种方法可以使用 LINQ 更新单个列,而不必加载整行?

现在我恢复使用 ExecuteCommand,速度至关重要,但这很丑陋且容易出错:

wdc.ExecuteCommand("UPDATE Article SET ItemsInStock = @1 WHERE ID = @2", itemsinstock,id);

最佳答案

您需要将 Article 类的所有属性的 UpdateCheck 除了主键(单击 LINQ2SQL 设计器中的类属性并切换到属性工具窗口)设置为从不(不确定 WhenChanged,也许这也有效 - 继续并试验一下!)。

这将强制使用 LINQ2SQL

UPDATE ... SET ... WHERE ID = @2

而不是在 WHERE 子句中包含所有列的长版本:

  UPDATE ... SET ... WHERE ID = @2 AND ItemsInStock = @1 AND SomeOtherColumn = @3 AND...

现在你可以使用如下代码

context.Articles.Attach(article /* article with updated values */, new Article { ID = articleID, ItemsInStock = -1 } /* pretend that this is the original article */);
context.SubmitChanges();

基本上你指出只有 ItemsInStock 属性发生了变化 - 其他 Prop 应该具有相同的默认值,articleID 当然是相同的。

注意:您不需要在此之前获取文章。

关于c# - 如何在不加载整行的情况下更新 LINQ 中的单个列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/221475/

相关文章:

C# LINQ 按如下所示格式的对象列表进行分组

c++ - 在不阻塞资源的情况下有效地等待标志状态更改?

javascript - 递归 Javascript 对象会导致任何问题(内存泄漏)吗?

c# - 无法在 visual studio 2012 中的 asp.net 中使用 sql server ce 4.0

c# - 如何使用 wkhtmltopdf 将 html 作为字符串传递?

c# - 如何相对于按钮在 Windows 应用商店应用程序中定位弹出控件?

c# - 动态 Linq : How to specify the StringComparison type?

c# - .Net 类中的代码是否总是在创建它的线程上运行?

c# - 使用FileSystemWatcher检测xml文件,使用Linq读取xml文件提示结果错误 "Root Element is Missing"

mysql - 为什么相同的 MySQL 查询对于不同的 ID 会花费更长的时间?