• Microsoft .NET
  • LINQ
  • Часто задаваемые вопросы о LINQ: третья часть

Часто задаваемые вопросы о LINQ: третья часть

ОГЛАВЛЕНИЕ

•    Скачать исходный код Параллельности - 11 Кб
•    Скачать увязку XML - 12.7 Кб
•    Скачать исходный код CRUD - 2.14 Мб
•    Скачать исходный код компилируемого запроса - 849 Кб

Введение и цель

Это третий выпуск в серии часто задаваемых вопросов о LINQ. В этом выпуске рассмотрены часто задаваемые вопросы о LINQ, касающиеся обработки параллельности, компилируемых запросов, реализации CRUD(создание, чтение, обновление, удаление), и увязки простых классов .NET с конфигурацией файла XML. Статьи в формате часто задаваемых вопросов по существу дела и позволяют узнать больше, прочитав меньше.

Ниже дана ссылка на полноценную электронную книгу часто задаваемых вопросов на 400 страниц, охватывающую различные технологии .NET типа Azure, WCF, WWF, Silverlight, WPF, SharePoint, и многое другое: http://www.questpond.com/SampleDotNetInterviewQuestionBook.zip.

Ссылки на первую и вторую часть
•    LINQ FAQ – первая часть для новичков. Это первая часть серии LINQ FAQ, начинающаяся  с того, чем именно является LINQ, и рассказывающая о разных форматах запроса LINQ вроде «сгруппировать по», «упорядочить по», «поиск с критерием» и т. д.
Обязательна  к прочтению для новичков в технологиях LINQ: LINQNewbie.aspx.
•    LINQ FAQ – вторая часть. Здесь показан базовый пример LINQ для SQL, как определить отношения 1-1 и 1-много с помощью LINQ, как оптимизировать запросы LINQ, выполнение хранимых процедур с помощью LINQ, и, наконец, показан простой пример CRUD с использованием LINQ для SQL: LINQFAQPart2.aspx.
Как обрабатывается параллельность в LINQ?

LINQ дает три способа решения конфликтов параллельности. Чтобы решить конфликты параллельности, надо обернуть код LINQ для SQL в блок try и перехватить ChangeConflictException. Затем надо пройти в цикле по коллекции ChangeConflicts, чтобы указать, как должен быть решен конфликт.

catch (ChangeConflictException ex)
{
    foreach (ObjectChangeConflict objchangeconf in objContext.ChangeConflicts)
    {
        objchangeconf.Resolve(RefreshMode.OverwriteCurrentValues);
    }
}

LINQ представляет следующие три способа решения конфликтов параллельности:
•    KeepCurrentValues: Если задана эта опция, и возникают конфликты параллельности, LINQ вызывает значения объекта-сущности LINQ как есть и не проталкивает новые значения из базы данных в объект LINQ.
•    OverwriteCurrentValues: Если задана эта опция, текущие данные объекта LINQ заменяются на значения базы данных.
•    KeepChanges: Самая странная, но иногда полезная опция. Классы могут иметь много свойств. Изменившиеся свойства оставляются как есть, а неизменившиеся свойства извлекаются из базы данных и заменяются.

Для задания требуемых опций используется RefereshMode, как показано во фрагменте кода ниже.

Какие другие средства предоставляет LINQ для тонкой настройки параллельности на уровне поля?

Система параллельности LINQ позволяет контролировать поведение параллельности на уровне поля. С помощью атрибута UpdateCheck можно задать три опции:
•    Never: Не использовать это поле при проверке конфликтов параллельности.
•    Always: Всегда использовать это поле для проверки конфликтов параллельности.
•    WhenChanged: Только если значение члена изменилось, использовать это поле для обнаружения конфликтов параллельности.

Фрагмент кода ниже показывает, как использовать атрибут UpdateCheck для контроля опций параллельности уровня свойства / поля, как сказано выше.

[Column(DbType = "nvarchar(50)",UpdateCheck=UpdateCheck.Never)]
public string CustomerCode
{
    set
    {
        _CustomerCode = value;
    }
    get
    {
        return _CustomerCode;
    }
}

Какие средства сообщения об ошибках предоставляет LINQ при возникновении конфликтов параллельности?

Система параллельности LINQ позволяет задать способ, как должно сообщаться о конфликтах. Система LINQ имеет два способа сообщения о конфликтах:
•    ContinueOnConflict: Эта опция приказывает механизму LINQ продолжить даже при наличии конфликтов и вернуть все конфликты в конце обработки.
•    FailOnFirstConflict: Эта опция помогает остановиться, как только возникнет первый конфликт, и вернуть все конфликты в исходное время, то есть механизм LINQ не продолжает дальше выполнять код.

Обе эти опции задаются как входные данные в методе SubmitChanges с помощью перечисления ConflictMode. Ниже приведен фрагмент кода, задающий режимы конфликта:

objContext.SubmitChanges(ConflictMode.ContinueOnConflict);