LINQ to SQL, Методи GetCommand(), GetTable() та GetChangeSet()
LINQ --- LINQ to DataSet та SQL --- Методи GetCommand(), GetTable() та GetChangeSet()
»» У ДАНІЙ СТАТТІ ВИКОРИСТОВУЄТЬСЯ ВИХІДНИЙ КІД ДЛЯ ПРИКЛАДІВ
GetCommand()
Ще один потенційно корисний метод – це GetCommand. Коли викликається метод GetCommand на об'єкті DataContext і передається інтерфейс LINQ to SQL на ім'я IQueryable, то повертається об'єкт типу System.Data.Common.DbCommand. Повернутий об'єкт DbCommand містить доступ до кількох ключових компонентів, які будуть використані запитом.
Витягуючи об'єкт DbCommand за допомогою методу GetCommand, можна отримати посилання на об'єкти CommandText, CommandTimeout, Connection, Parameters і Transaction, поряд з деякими іншими, які стосуються переданого запиту. Це дозволяє не тільки переглядати ці об'єкти, але й модифікувати їх, змінюючи значення за замовчуванням, без модифікації тих самих запитів, які будуть виконані поточним екземпляром DataContext.
Можливо, для конкретного запиту знадобиться збільшити значення CommandTimeout, але так, щоб не змінювати значення таймуута для всіх інших запитів, які виконуються з даним об'єктом DataConext.
Метод GetCommand має один прототип, описаний нижче:
Цим методом передається запит LINQ to SQL у формі IQueryable, а він повертає System.Data.Common.DbCommand цього запиту.
У наступному прикладі виходить об'єкт DbCommand для зміни значення CommandTimeout запиту. На консоль виводиться значення CommandText, яким буде сам запит SQL:
Про цей приклад говорити особливо нема чого. Тут просто оголошується запит, який передається методом GetCommand. Потім відображається значення CommandTimeout для повернутий об'єкт DbCommand. Далізначення CommandTimeout встановлюється 1 і виводиться сам запит SQL разом із новим значенням CommandTimeout. І останнє – виконується перерахування результатів, повернутих запитом. Нижче наведено результати запуску цього коду:

Зрозуміло, якщо цей запит вимагатиме надто багато часу для виконання, він буде перерваний по таймууту, і результати виявляться іншими.
GetChangeSet()
Іноді зручно мати можливість отримати список всіх сутнісних об'єктів, які будуть вставлені, змінені або видалені під час виклику методу SubmitChanges. Метод GetChangeSet служить саме для цього.
Метод GetChangeSet має один прототип, описаний нижче:
Цей метод не приймає нічого та повертаєоб'єкт ChangeSet. Об'єкт ChangeSet містить колекції типу IList для вставлених, модифікованих та віддалених об'єктів, де T – сутнісний клас. Ці властивості-колекції називаються Inserts, Updates та Deletes відповідно.
У наступному прикладі сутнісний об'єкт модифікується, вставляється та видаляється. Потім за допомогою методу GetChangeSet вилучається ChangeSet і здійснюється перерахування кожної колекції:
У цьому прикладі спочатку модифікується Region замовника LAZYK. Потім замовник LAWN вставляється, а замовник LONEP видаляється. Після цього за допомогою методу GetChangeSet виходить ChangeSet. І, нарешті, здійснюється перерахування кожної колекції – Inserts, Updates та Deletes – з відображенням кожного сутнісного об'єкта у відповідній колекції.
Нижче показані результати:

Звичайно, у попередньому прикладі можна виконувати перерахування кожної колекції, припускаючи, що кожен елемент є об'єктом Customer, тому що відомо, що так воно і є. Однак у багатьох випадках у колекції може існуватибільше одного типу об'єктів, і робити такі припущення не вдасться. У таких ситуаціях потрібно написати власний перелік для обробки множинних типів даних. Допомогти цьому може операція OfType.
Метод GetTable використовується для отримання посилання на послідовність Table із DataContext для певної таблиці бази даних. Цей метод зазвичай застосовується лише разом із класом DataContext, а чи не [Your]DataContext. Використання класу [Your]DataContext є кращою технікою, оскільки цей клас вже матиме послідовність Table, що посилається на кожну відображену таблицю.
Метод GetTable має два прототипи, які описані нижче:
Перший прототип GetTable
Цьому методу надається вказаний тип сутнісний Т, і він повертає послідовність Table об'єктів типу Т.
Другий прототип GetTable
Цей метод приймає Type сутнісного об'єкта та повертає інтерфейс таблиці. Потім цей інтерфейс ITable можна використовувати на власний розсуд. Щоб застосувати інтерфейс ITable, як це була таблиця, не забудьте привести його до IQueryable .
У прикладі першого прототипу нижче для отримання певного замовника використовується стандартний клас DataContext замість класу [Your]DataContext на ім'я Northwind:
Тут викликається метод GetTable для отримання посилання таблицю Customer, щоб мати можливість витягти конкретного замовника. Ось результат:
Для другого прототипу методу GetTable використовується DataContext замість [Your]DataContext. Нижче наведено той самий базовий приклад, що й попередній, але в ньому застосовується другий прототип:
He має бути сюрпризом, що результат роботи цього коду збігається з результатомвиконання попереднього.