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

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

问题描述:

我需要更新包含大量行的表中的列。每行都有一些大的TEXT列,我不需要更新。Linq2SQL:只选择一些列,但仍然能够提交更改

我使用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语句?

+1

为什么你需要通过LINQ -2-做到这一点的sql?你不能只发出原始查询吗? – alexn

+0

@alexn'新的Guid()'部分更复杂,如我的示例中所示。 – okrumnow

首先,如果您在数据库中没有主键,那么您将无法通过Linq-To-Sql进行更新。如果你有一个主键,但就是不知道它是,你可以通过执行类似

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

一旦你知道主键,你可以不喜欢下面找到它在Linqpad,(我假设了主键名为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(); 
+0

接近最终解决方案。关于[链接](http://devio.wordpress.com/2011/01/16/updating-a-single-column-in-linq-to-sql-using-attach/),你必须附加第二个新的对象具有相同的ID但数据与上下文不同,然后提交。终于奏效了。感谢大家的帮助。 – okrumnow

+1

你提到的这个链接中的例子似乎违反直觉,因为你会期望ID会以“一些随机值”结束。我不否认它有效,但我无法解释它为什么起作用。但是,我意识到我的例子中有一个错误(应该立即修复),因为您需要首先附加新记录,然后进行更改。 – sgmoore

+0

我同意这是违反直觉,但它的作品。我认为这些参数是从上次到第一次处理的。 您编辑的版本更有意义,我会检查它明天是否有效,谢谢。 – okrumnow

的方式来更新Linq中的数据库记录到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/

您也可以升表可更新的,在视图中的更新作为对表的更新进行ook:http://devio.wordpress.com/2011/01/16/updating-a-single-column-in-linq-to-sql-summary/

+0

这似乎在LinqPad中不起作用,LinqPad自动生成映射。你提到的文章说:在一个.dbml文件 _When映射视图,你必须照顾: *主键列 _ 我没有.dbml文件,并没有找到一个方法来定义定义LinqPad中的主键列。 – okrumnow