2011-11-22 48 views
1

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

回答

2

首先,如果您在數據庫中沒有主鍵,那麼您將無法通過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

4

的方式來更新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

相關問題