如何更新LINQ中的单个列而不加载整行?

时间:2008-10-21 11:08:58

标签: 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);

3 个答案:

答案 0 :(得分:9)

你需要在Article类的所有属性上设置UpdateCheck,除了主键(单击LINQ2SQL设计器中的类属性并切换到属性工具窗口)到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当然是相同的。

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

答案 1 :(得分:0)

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

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

这样就不会加载不需要的列,当然也不会将其发送回数据库。

答案 2 :(得分:0)

它会工作得很好 ExecuteCommand(“UPDATE tIdx_TicketActivity SET Archive = {0} WHERE ExpiryTimeStamp