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语句?
首先,如果您在数据库中没有主键,那么您将无法通过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();
接近最终解决方案。关于[链接](http://devio.wordpress.com/2011/01/16/updating-a-single-column-in-linq-to-sql-using-attach/),你必须附加第二个新的对象具有相同的ID但数据与上下文不同,然后提交。终于奏效了。感谢大家的帮助。 – okrumnow
你提到的这个链接中的例子似乎违反直觉,因为你会期望ID会以“一些随机值”结束。我不否认它有效,但我无法解释它为什么起作用。但是,我意识到我的例子中有一个错误(应该立即修复),因为您需要首先附加新记录,然后进行更改。 – sgmoore
我同意这是违反直觉,但它的作品。我认为这些参数是从上次到第一次处理的。 您编辑的版本更有意义,我会检查它明天是否有效,谢谢。 – 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/
这似乎在LinqPad中不起作用,LinqPad自动生成映射。你提到的文章说:在一个.dbml文件 _When映射视图,你必须照顾: *主键列 _ 我没有.dbml文件,并没有找到一个方法来定义定义LinqPad中的主键列。 – okrumnow
为什么你需要通过LINQ -2-做到这一点的sql?你不能只发出原始查询吗? – alexn
@alexn'新的Guid()'部分更复杂,如我的示例中所示。 – okrumnow