Linq2SQL: выберите только некоторые столбцы, но все еще можете отправлять изменения - PullRequest
1 голос
/ 22 ноября 2011

Мне нужно обновить столбец в таблице, которая содержит много строк.В каждой строке есть несколько больших столбцов 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?

Ответы [ 2 ]

4 голосов
/ 22 ноября 2011

Способ обновления определенных столбцов записи базы данных в 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/

Также вы можете посмотреть на: http://devio.wordpress.com/2011/01/16/updating-a-single-column-in-linq-to-sql-summary/

2 голосов
/ 22 ноября 2011

Во-первых, если у вас нет первичного ключа в базе данных, то вы не сможете обновить через 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();
...