2010-11-10 2 views
1

В настоящее время я обновляю один элемент в базе данных следующим образом:Update только один элемент в LINQ

var master = (from tmi in db._Masters where tmi.Id == Id select tmi).FirstOrDefault(); 
master.logPosition++; 
db.SubmitChanges(); 

Это кажется мне неэффективным, так как (я думаю) я вытаскивая полный DB строку просто обновить одно значение. Есть ли более эффективный запрос, который я могу использовать?

ответ

2

Вы можете выбрать только поле, которое нужно изменить, регулируя оригинал LINQ выберите:

var master = (from tmi in db._Masters 
       where tmi.Id == Id 
       select new { tmi.logPosition }).FirstOrDefault(); 
master.logPosition++; 
db.SubmitChanges(); 

EDIT: При выборе конкретных данных в связанные свойства, свойство logPosition должна терять только для чтения статуса и быть полностью обновляемым.

var master = (from tmi in db._Masters 
       where tmi.Id == Id 
       select new { 
        ID = tmi.ID, 
        logPosition = tmi.logPosition }).FirstOrDefault(); 
master.logPosition++; 
db.SubmitChanges(); 
+0

возможно, мастер ++? если вы выберете новое {tmi.logPosition}, он вернет logPosition не класс, у которого есть свойство logPosition как свойство. –

+1

Но это дает «свойство не может быть воспринято - это только для чтения» ошибка? (Я действительно пытался это сделать раньше). – linq

+0

@Stephan P .: Если запрос закончился 'select tmi.logPosition', тогда вы правы, но в конце запроса создается новый экземпляр анонимного типа, поэтому Joel является правильным. –

1

Я предполагаю, что это LINQ to SQL; исправьте, если ошибаетесь.

Вы можете сделать хранимую процедуру и pull that stored procedure into your DataContext, а затем вызвать хранимую процедуру вместо использования вышеуказанного запроса.

В качестве альтернативы вы можете вручную написать запрос на обновление и использовать DataContext.ExecuteQuery для выполнения запроса.

Однако, Ничего из этого не имеет значения, пока вы не профиль и не выясните, действительно ли это является узким местом. Если это не так, я буду придерживаться простейшего, что работает, что у вас уже есть.

0

@linq

Я не могу получить ответ на принятый Joel работать.

Выбрать новый {} создает анонимный тип, который не является обновляемым (как указано в комментарии, см. Также this question), а также не является частью DataContext.

я описал пару possible solutions

  • хранимой процедуры
  • Просмотр
  • ExecuteCommand
  • DBML отображений

на моем блоге.

Смежные вопросы