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

本文关键字:情况下 更新 单个列 LINQ 加载 | 更新日期: 2023-09-27 17:48:48

在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);

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

您需要将Article类的所有属性(主键除外)的UpdateCheck(在LINQ2SQL设计器中单击类属性并切换到properties Tool窗口)设置为Never(不确定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属性发生了更改——其他道具应该具有相同的默认值,articleID当然是相同的。

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

ligget78给了我另一个如何更新单列的想法:

为这种更新创建一个新的DataContext,并且只将所需的列包含在此DataContext中。

这样,不需要的列甚至不会被加载,当然也不会被发送回数据库。

它可以正常工作ExecuteCommand("UPDATE tIdx_TicketActivity SET Archive={0}WHERE ExpiryTimeStamp