Почему LinqToSql сгенерировал предложение Where, столь запутанное? - PullRequest
0 голосов
/ 06 октября 2009

Я получаю ежедневный XML-файл, который я использую для обновления базы данных содержимым. Файл всегда является полным файлом, т.е. все включено, независимо от того, изменено оно или нет. Я использую Linq2Sql для обновления базы данных, и я спорил, стоит ли проверять, изменилось ли что-либо в каждой записи (большинство не изменится), и обновлять только те, которые изменились, или просто обновлять каждую запись текущими данными.

Мне кажется, что мне нужно запустить базу данных с обновлением для каждой записи, чтобы я мог отсеять записи, которые не включены в XML-файл. Я устанавливаю обработанную дату для каждой записи, а затем повторно проверяю не обработанные, чтобы удалить их. Тогда я подумал, должен ли я просто найти соответствующую запись в базе данных и обновить объект текущей информацией, изменился он или нет. Это привело меня к более внимательному взгляду на SQL, созданный для обновлений. Я обнаружил, что только те данные, которые изменились, задаются в операторе обновления базы данных, но я обнаружил, что предложение WHERE включает в себя все столбцы в записи, а не только первичный ключ . Это кажется очень расточительным с точки зрения данных, летящих по системе, и поэтому меня удивляет, почему это так и есть ли настройка для контекста LinqToSql, чтобы использовать только первичный ключ в предложении.

Итак, у меня два вопроса:

  1. Почему в предложении LinqToSql where включены все текущие данные, а не только первичный ключ?
  2. Есть ли способ настроить контекст на использование только первичного ключа в предложении where?

Ответы [ 2 ]

2 голосов
/ 06 октября 2009

Это оптимистичный параллелизм - он в основном гарантирует, что он не растопчет изменения, сделанные чем-то еще. Вы можете настроить параметры параллелизма различными способами, хотя я не эксперт в этом.

Страница MSDN для оптимистического параллелизма Linq to Sql является хорошей отправной точкой.

Если у вас есть столбец, представляющий «версию» строки (например, автоматически обновленную временную метку), вы можете использовать только это - или вы можете просто установить UpdateCheck=Never для всех столбцов, если вы знаете, что больше ничего не изменит данные .

Вы недостаточно подробно описали "ваше использование обработанной даты", чтобы ответить на третий пункт.

1 голос
/ 06 октября 2009

Чтобы ответить на вопрос №2, в конструкторе dbml задайте для свойства «Проверка обновлений» значение «Никогда» на уровне столбцов для каждого столбца таблицы, чтобы избежать генерации массовых предложений where.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...