Linq2SQL:只选择一些列,但仍然能够提交更改

本文关键字:提交 选择 Linq2SQL | 更新日期: 2023-09-27 18:15:18

我需要更新包含很多行的表中的一列。每一行都有一些大的TEXT列,我不需要更新。

我用的是LinqPAD,这大概就是我想要做的:

(from s in Table
where s.FK_ID == null 
select new{s.FK_ID, s.Datum, s.PBNummer}).ToList()
.ForEach(s => s.FK_ID = new Guid(...some new guid here...));
SubmitChanges();

这不能编译,因为匿名类类型的属性是只读的。

如果我这样做

(from s in Table
where s.FK_ID == null 
select s).ToList()

,我可以更新和保存,但所有列都被加载,这需要很长时间,并导致内存问题。

是否有一种方法,只加载一些列,但仍然有一个对象,我可以更新和保存使用SubmitChanges ?或者我必须切换到SQL语句?

Linq2SQL:只选择一些列,但仍然能够提交更改

在Linq to SQL中更新数据库记录的特定列的方法是在包含大列的表上创建一个视图,并且只包括"短"列:

CREATE VIEW [dbo].[V_FooMax] AS
SELECT  OID, ID
FROM    dbo.FooMax

由于基于单个表的视图是可更新的,因此对视图的更新就像对表的更新一样执行:

using (var database = new DataContext())
{
  var fooView = database.V_FooMaxes
    .Where(foo => foo.OID == OID).FirstOrDefault();
  fooView.ID = newID;
  database.SubmitChanges();
}

参考:http://devio.wordpress.com/2011/01/15/updating-a-single-column-in-linq-to-sql-using-a-view/

也可以查看:http://devio.wordpress.com/2011/01/16/updating-a-single-column-in-linq-to-sql-summary/

首先,如果数据库中没有主键,那么您将无法通过Linq-To-Sql进行更新。如果你有一个主键,但不知道它是哪个,你可以在Linqpad中找到它,方法是输入

var table =  (from t in Mapping.GetTables() 
              where t.TableName == "[Table]" select t).SingleOrDefault();
(from dm in table.RowType.DataMembers 
           where dm.DbType != null && dm.IsPrimaryKey 
           select dm.Name)
          .Dump("Primary Key");

一旦知道了主键,就可以执行如下操作(我假设主键名为Id)

var oldList = (from s in Table
          where s.FK_ID == null 
          select new{s.Id , s.FK_ID, s.Datum, s.PBNummer}).ToList() ;

这与您的查询类似,除了我添加了主键

foreach(var r in oldList)
{
    Table t = new Table();
    t.Id        = r.Id ;
    Table.Attach(t);
    t.FK_ID   = new Guid(...some new guid here...));
}
SubmitChanges();