【问题标题】:Linq2SQL: Select only some columns, but still able to submit changesLinq2SQL:只选择一些列,但仍然能够提交更改
【发布时间】:2011-11-22 08:33:06
【问题描述】:

我需要更新包含很多行的表中的列。每行都有一些大的 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 语句?

【问题讨论】:

  • 为什么需要通过 linq-2-sql 来做这个?您不能只发出原始查询吗?
  • @alexn 'new Guid()' 部分更复杂,如我的示例所示。

标签: c# sql-server linq-to-sql linqpad


【解决方案1】:

在 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/

【讨论】:

  • 这似乎在 LinqPad 中不起作用,其中映射是由 LinqPad 本身自动生成的。您提到的文章说:_在.dbml文件中映射视图时,您必须注意:*主键列的定义_我没有.dbml文件,也没有找到在LinqPad中定义主键列的方法.
【解决方案2】:

首先,如果您在数据库中没有主键,那么您将无法通过 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();

【讨论】:

  • 这已接近最终解决方案。关于link,您必须将具有相同 id 但不同数据的第二个新对象附加到上下文,然后提交。这终于奏效了。感谢大家的帮助。
  • 您提到的此链接中的示例似乎违反直觉,因为您希望 ID 以“某个随机值”结尾。我不否认它有效,但我无法解释它为什么有效。但是,我意识到我的示例中确实存在错误(现在应该修复),因为您需要先附加新记录,然后再进行更改。
  • 我同意这是违反直觉的,但它确实有效。我认为参数是从最后一个到第一个处理的。您编辑的版本更有意义,我明天会检查它是否有效,谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-08
相关资源
最近更新 更多