2011-01-28 4 views
2

Я только начинаю использовать linq для sql для доступа к данным. Он работает нормально только для чтения. Но он не работает для обновления. Я читал темы на нескольких форумах. Понятно, что анонимные типы (в моем случае var) не могут быть обновлены. Я не могу найти то, что должен заменить var, и где я его нахожу. Буду признателен за любую помощь.Linq to SQL Обновление данных

Ниже приведен код. Исключение составляет

Error 1 Свойство или индексатор «AnonymousType # 1.date_last_logon» не может быть назначен - это только для чтения

fmcsaDataContext db = new fmcsaDataContext(); 
// DataTable _UserTable; 
UserModel _UserModel = new UserModel(); 

var users = from u in db.FMCSA_USERs 
      where u.USER_NAME == pName && u.ACTIVE == true 
      select new 
      { 
        date_last_logon = u.DATE_LAST_LOGON, 
        date_current_logon = u.DATE_CURRENT_LOGON, 
        failed_login = u.FAILED_LOGIN, 
      }; 

if (users.Count() == 0) 
    return null; 

foreach (var user in users) 
{ 
    user.date_last_logon = user.date_current_logon; 
} 

ответ

5

Это относится к любому инструменту ORM; вам придется использовать типы объектов, которые LINQ-to-SQL генерирует для вас, когда вы делаете свой .dbml-файл, если вы хотите выполнять операции CRUD.

Также имейте в виду, что ваш запрос выполняется дважды и не является одновременно безопасным; вызывающий Count() выполняет ваш запрос с помощью агрегата Count в базе данных, затем цикл за ним выполняет запрос снова, на этот раз вернув результаты. Учитывая то, что вы делаете, это может быть лучше:

var users = (from u in db.FMCSA_USERs 
       where u.USER_NAME == pName && u.ACTIVE == true 

       select u).ToList(); // This executes the query and materializes 
            // the results into a List<FMCSA_USER> 

if (users.Count == 0) return null; 

foreach (var user in users) 
{ 
    user.date_last_logon = user.date_current_logon; 
} 

db.SaveChanges(); 
+0

Это именно то, что мне нужно, спасибо Адаму. –

4

Для того, чтобы обновить данные, вы не можете использовать анонимный типы.
Вместо этого вы можете завершить свой запрос select u;, чтобы выбрать фактические объекты.

+0

+1. Не уверен, откуда это происходит, но это совершенно правильно. –

0

Таблица вы пытаетесь выполнить обновление с помощью LINQ, должны иметь Первичный ключ.

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