Общие сведения о серверном веб-элементе управления LinqDataSource

Обновлен: Ноябрь 2007

Элемент управления LinqDataSource предоставляет веб-разработчикам встроенный язык запросов (LINQ) через архитектуру ASP.NET элементов управления источниками данных. LINQ предоставляет унифицированную модель программирования для создания запросов и обновления данных из различных типов источников, а также расширяет возможности обработки данных в языках C# и Visual Basic. LINQ упрощает взаимодействие между объектно-ориентированным программированием и реляционными данными, применяя принципы объектно-ориентированного программирования для реляционных данных. Дополнительные сведения о LINQ см. в разделе LINQ.

С помощью декларативной разметки можно создать элемент управления LinqDataSource, который либо подключается к базе данных, либо использует данные, хранящиеся в памяти, например, массивы. В декларативном тексте можно указать все условия, необходимые для извлечения, фильтрации, сортировки и группировки данных. Когда данные извлекаются из таблицы базы данных SQL, можно также сконфигурировать элемент управления LinqDataSource для обработки обновления, вставки и удаления данных. Элемент управления выполняет эти задачи, не требуя от разработчика написания команд SQL. Класс LinqDataSource также предоставляет модель событий, которая позволяет обрабатывать пользовательские сценарии.

В этом разделе рассматриваются следующие темы:

  • Сценарии

  • Базовые сведения

  • Примеры кода

  • Ссылки на классы

Сценарии

Элемент управления LinqDataSource используется при создании веб-страниц, извлекающих или изменяющих данные, и позволяет воспользоваться преимуществами унифицированной модели программирования, предоставляемой LINQ. Элемент управления LinqDataSource упрощает код веб-страницы, автоматически создавая команды для взаимодействия с данными.

К началу

Базовые сведения

Элемент управления LinqDataSource обеспечивает способ подключения элемента управления данными к различным источникам данных. К ним относятся базы данных, классы источников данных и коллекции в памяти. Элемент управления LinqDataSource позволяет указать задачи извлечения (выбор, фильтрация, группировка и сортировка) для всех этих типов источников данных. Для таблиц базы данных можно указать задачи изменения (обновление, удаление и вставка).

Можно подключить элемент LinqDataSource к коллекции любого типа данных, сохраняемой в открытом поле или свойстве. Декларативная разметка и код для выполнения операций с данными одинаковы для всех источников данных. Не нужно использовать различный синтаксис при работе с данными из таблиц базы данных или данными из коллекций, таких как массивы.

Вводные сведения об элементе управления LinqDataSource см. в разделе Пошаговое руководство. Извлечение, обновление, вставка и удаление данных с помощью элементов управления LinqDataSource и DetailsView.

Подключение к данным в базе данных

При взаимодействии с данными, хранящимися в базе данных, разработчик не подключает элемент управления LinqDataSource непосредственно к базе данных. Вместо этого он взаимодействует с классами сущностей, представляющими базу данных и таблицы. Классы сущностей можно создать, используя Сред. Объектно-реляционный конструктор или программу SqlMetal.exe. Дополнительные сведения см. в разделе Реляционный конструктор объектов или Средство создания кода (SqlMetal.exe). Как правило, создаваемые классы сущностей находятся в папке App_Code веб-приложения. Программа SqlMetal.exe или Сред. Объектно-реляционный конструктор создаст один класс, представляющий базу данных и по одному классу для каждой таблицы в базе данных.

Класс, представляющий базу данных, отвечает за извлечение и сохранение значений в источник данных. Элемент управления LinqDataSource зачитывает и устанавливает свойства класса, представляющего таблицу данных. Для поддержки операций обновления, вставки и удаления класс базы данных должны быть производным от класса DataContext, а класс таблицы должен ссылаться на класс Table<TEntity>.

Элемент управления LinqDataSource подключается к классу базы данных путем присвоения свойству ContextTypeName имени класса, представляющего базу данных. LinqDataSource подключается к конкретной таблице путем присвоения свойству TableName имени класса, который представляет таблицу. Например, чтобы подключиться к таблице Contacts базы данных AdventureWorks, присвойте свойству ContextTypeName значение AdventureWorksDataContext (или другое имя, используемое для указания объекта базы данных). Присвойте свойству TableName значение Contacts. В следующем примере показана разметка для элемента управления LinqDataSource, который подключается к базе данных AdventureWorks.

<asp:LinqDataSource 
    ContextTypeName="AdventureWorksDataContext" 
    TableName="Contacts" 
    ID="LinqDataSource1" 
    runat="server">
</asp:LinqDataSource>

В примере не показан класс, который создает Сред. Объектно-реляционный конструктор, поскольку этот код слишком большой для данного раздела. Тем не менее, чтобы пример мог работать, сгенерированный код должен присутствовать. Дополнительные сведения см. в разделе Создание кода в LINQ to SQL.

Подключение к данным, хранящимся в памяти как коллекции

При подключении к коллекции, представляющей данные в памяти, например массиву, присвойте свойству ContextTypeName имя класса, содержащего коллекцию. Присвойте свойству TableName имя самой коллекции.

В следующем примере показан класс, содержащий массив строк.

Public Class MovieLibrary
    Dim _availableGenres() As String = {"Comedy", "Drama", "Romance"}

    Public ReadOnly Property AvailableGenres() As String()
        Get
            Return _availableGenres
        End Get
    End Property

End Class
public class MovieLibrary
{
    string[] _availableGenres = { "Comedy", "Drama", "Romance" };

    public MovieLibrary()
    {
    }

    public string[] AvailableGenres
    {
        get
        {
            return _availableGenres;
        }
    }
}

В следующем примере элемент управления LinqDataSource зачитывает список жанров фильмов из класса, приведенного в предыдущем примере. Для извлечения массива жанров присвойте свойству ContextTypeName значение MovieLibrary, а свойству TableName значение AvailableGenres.

<asp:LinqDataSource 
    ContextTypeName="MovieLibrary" 
    TableName="AvailableGenres" 
    ID="LinqDataSource1" 
    runat="server">
</asp:LinqDataSource>

Использование элемента управления LinqDataSource с элементами управления с привязкой к данным

Чтобы получить данные из элемента управления LinqDataSource, можно связать с ним элемент управления с привязкой к данным. Например, привязать такие элементы управления, как DetailsView, GridView или ListView к элементу управления LinqDataSource. Для этого присвойте свойству DataSourceID элемента управления с привязкой к данным идентификатор элемента управления LinqDataSource. В следующем примере показан элемент управления GridView, отображающий все данные из LinqDataSource.

<asp:LinqDataSource 
    runat="server"
    ContextTypeName="AdventureWorksDataContext" 
    TableName="Contacts" 
    ID="LinqDataSource1">
</asp:LinqDataSource>
<asp:GridView 
    ID="GridView1" 
    runat="server"
    DataSourceID="LinqDataSource1" >
</asp:GridView>

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

Путем настройки элемента управления с привязкой к данным можно ограничить набор отображаемых данных (свойств), не допуская автоматического создания полей данных. Затем можно определить эти поля явным образом в элементе управления с привязкой к данным. Элемент управления LinqDataSource извлекает все свойства, но элемент управления с привязкой к данным отображает только выбранные свойства. В следующем примере показан элемент управления GridView, отображающий только свойства Name и StandardCost из таблицы Products базы данных AdventureWorks. Свойство AutoGenerateColumns имеет значение false.

<asp:LinqDataSource 
    ContextTypeName="AdventureWorksDataContext" 
    TableName="Products" 
    ID="LinqDataSource1" 
    runat="server">
</asp:LinqDataSource>
<asp:GridView 
    DataSourceID="LinqDataSource1" 
    AutoGenerateColumns="false"
    ID="GridView1" 
    runat="server">
    <Columns>
        <asp:BoundField DataField="Name" />
        <asp:BoundField DataField="StandardCost" />
    </Columns>
</asp:GridView>

Если необходимо ограничить набор свойств, возвращаемых запросом, определите их с помощью свойства Select элемента управления LinqDataSource.

Сравнение элемента управления LinqDataSource с другими элементами управления источниками данных

Благодаря элементу управления LinqDataSource для работы с данными требуется писать меньше кода по сравнению с использованием элемента управления SqlDataSource или ObjectDataSource. Элемент управления LinqDataSource может вывести сведения об источнике данных, к которому выполняется подключение, и динамически создавать команды для выбора, обновления, вставки и удаления данных. Использование LinqDataSource требует изучения только одной модели программирования для взаимодействия с различными типами источников данных.

Сравнение с элементом управления SqlDataSource

В отличие от элемента управления SqlDataSource, который работает только с таблицами реляционных баз данных, LinqDataSource позволяет подключаться к данным, хранящимся как коллекции в памяти. При использовании элемента управления SqlDataSource необходимо явно задать SQL-запросы свойствам SelectCommand, UpdateCommand, InsertCommand и DeleteCommand. Однако при работе с элементом управления LinqDataSource нет необходимости явно задавать эти команды, так как LinqDataSource использует LINQ to SQL для создания их автоматически. Если требуется изменить набор столбцов, извлекаемых из источника данных, нет необходимости писать полную команду SQL SELECT. Вместо этого укажите указать имена столбцов, которые должен вернуть запрос, в свойстве Select.

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

Сравнение с элементом управления ObjectDataSource

При использовании элемента управления ObjectDataSource необходимо вручную создать объект, представляющий данные, и затем написать методы для взаимодействия с этими данными. Затем необходимо сопоставить свойства SelectMethod, UpdateMethod, InsertMethod и DeleteMethod с методами, выполняющими эти функции. В элементе управления LinqDataSource для автоматического создания классов, представляющих данные, используется Сред. Объектно-реляционный конструктор. Не нужно писать код, чтобы указать, какие столбцы существуют в таблице базы данных или как выбирать, обновлять, вставлять и удалять данные. Можно также использовать элемент управления LinqDataSource для взаимодействия непосредственно с коллекцией данных, например с массивом. В этом случае нет необходимости создавать класс для реализации логики взаимодействия с коллекцией данных.

Выборка данных

Если значение для свойства Select элемента управления LinqDataSource не задано, извлекаются все свойства, представляемые классом источника данных. Элемент управления LinqDataSource возвращает одно значение для каждого столбца в таблице базы данных.

Можно ограничить набор полей, извлекаемых из источника данных, присвоив свойству Select имена соответствующих свойств. Если требуется вернуть только одно поле, присвойте свойству Select имя соответствующего свойства. Например, чтобы вернуть только значения столбца City таблицы базы данных, присвойте свойству Select значение City. Элемент управления LinqDataSource вернет коллекцию List<T>, содержащую элементы корректного типа. Если свойство City имеет текстовый тип (строка), извлекаемые значения City возвращаются как коллекция строковых значений List<T>.

Чтобы извлечь из класса данных только определенные свойства, используйте функцию new в выражении для Select и укажите, какие столбцы должны возвращаться. Функция new необходима, так как создается динамический класс, который содержит только указанные свойства. Например, если требуется извлечь из источника данных свойства City и PostalCode, содержащие полный адрес, присвойте свойству Select выражение new(City, PostalCode). Элемент управления LinqDataSource вернет коллекцию List<T> из экземпляров класса, содержащего эти свойства.

Не нужно использовать функцию new при выборе только одного свойства, поскольку возвращаемый объект представляет собой простую коллекцию значений этого свойства. Тем не менее, при обращении к нескольким свойствам элемент управления LinqDataSource должен создать новый класс, содержащий необходимые свойства.

Вычисление значений с помощью предложения SELECT

В предложении SELECT можно вычислить значения. Например, чтобы рассчитать сумму по каждому заказу, присвойте свойству Select значение new(SalesOrderDetailID, OrderQty * UnitPrice As LineItemTotal). Ключевое слово As позволяет присвоить имя (псевдоним) вычисляемому значению. Дополнительные сведения см. в разделе Пошаговое руководство. Выбор и фильтрация подмножества данных с помощью элементов управления LinqDataSource и GridView.

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

<asp:LinqDataSource 
    ContextTypeName="ExampleDataContext" 
    TableName="OrderDetails" 
    Select="new(SalesOrderDetailID As DetailID, 
      OrderQty * UnitPrice As LineItemTotal, 
      DateCreated As SaleDate)"
    ID="LinqDataSource1" 
    runat="server">
</asp:LinqDataSource>

Фильтрация данных с помощью предложения WHERE

Фильтрация возвращаемых данных позволяет извлекать только те записи, которые удовлетворяют конкретным условиям. Это можно сделать, задав свойству Where условия, выполнение которых требуется для включения записи в возвращаемый набор. Если значение свойства Where не задано, из источника данных извлекаются все записи. Фильтрация выполняется путем создания выражения фильтра, в котором используется сравнение, определяющее, должна ли запись включаться в результирующий набор. Сравнение может выполняться со статическим значением или с переменным значением, указанным с помощью параметра-прототипа.

Создание предложения WHERE со статическими значениями

Для сравнения значения свойства со статическим значением следует задать выражение Where, использовав свойство и статическое значение. Например, чтобы вернуть только записи, которые имеют значение ListPrice больше 1000, присвойте Where значение ListPrice > 1000.

Можно использовать оператор && или and для задания логического И, а также операторы ||, либо or для логического ИЛИ. Например, присвойте свойству Where значение ListPrice > 1000 || UnitCost > 500 || DaysToManufacture > 3, чтобы вернуть записи со значением поля ListPrice больше 1000, или записи с UnitCost больше 500 или с DaysToManufacture больше 3. Чтобы указать, что для возвращаемых записей требуется выполнение всех условий, присвойте свойству Where значение ListPrice > 1000 && UnitCost > 500 && DaysToManufacture > 3.

При сравнении строковых значений необходимо заключить условия в одинарные кавычки, а литералы в двойные кавычки. Например, задайте свойству Where выражение 'Category = "Sports"' для извлечения только записей, имеющих в столбце Category значение «Sports».

В следующем примере показан элемент управления LinqDataSource, который извлекает данные, отфильтрованные по строковому и числовому значениям.

<asp:LinqDataSource
  ContextTypeName="ExampleDataContext"
  TableName="Product"
  Where='Category = "Sports" && Weight < 10'
  ID="LinqDataSource1"
  runat="server"
</asp:LinqDataSource>

Создание параметризованных предложений WHERE

Если требуется сравнить значение свойства со значением, известным только во время выполнения, следует в коллекции свойств WhereParameters определить параметр. Например, если требуется выполнить фильтрацию с использованием значения, предоставляемого пользователем, создайте параметр, который представляет это значение. Элемент управления LinqDataSource создаст предложение WHERE с текущим значением этого параметра.

В следующем примере показан элемент управления LinqDataSource, который извлекает данные, основываясь на выборе пользователя в элементе управления с именем DropDownList1.

<asp:DropDownList AutoPostBack="true" ID="DropDownList1" runat="server">
  <asp:ListItem Value="Sports">Sports</asp:ListItem>
  <asp:ListItem Value="Garden">Garden</asp:ListItem>
  <asp:ListItem Value="Auto">Auto</asp:ListItem>
</asp:DropDownList>
<asp:LinqDataSource 
    ContextTypeName="ExampleDataContext" 
    TableName="Products" 
    AutoGenerateWhereClause="true"
    ID="LinqDataSource1" 
    runat="server">
  <WhereParameters>
    <asp:ControlParameter 
      Name="Category" 
      ControlID="DropDownList1" 
      Type="String" />
  </WhereParameters>
</asp:LinqDataSource>
<asp:GridView 
    DataSourceID="LinqDataSource1"
    ID="GridView1" 
    runat="server">
</asp:GridView>

Элемент управления LinqDataSource автоматически создает предложение WHERE, когда свойству AutoGenerateWhereClause присваивается значение true. Этот параметр полезен при наличии нескольких параметров, позволяя не указывать в свойстве Where каждое условие. Вместо этого разработчик добавляет параметры в коллекцию свойств WhereParameters, и элемент управления LinqDataSource создает предложение WHERE, включающее каждый параметр.

При задании свойству AutoGenerateWhereClause значения true имена параметров должны соответствовать именам соответствующих свойств. Например, чтобы сравнить значение параметра со свойством Category, параметр должен иметь имя Category. Все сравнения представляют собой равенства; нельзя сравнивать значение параметра, используя операции «больше» или «меньше». При указании более одного параметра в коллекции WhereParameters параметры связываются с помощью логического И.

Если требуется выполнить проверку неравенства или связать условия с помощью логического ИЛИ, присвойте свойству AutoGenerateWhereClause значение false. Затем можно определить условия в свойстве Where. Для каждого параметра в выражении Where необходимо указать местозаполнитель.

В следующем примере показано, как выполнить проверку на неравенство при выполнении фильтрации данных.

<asp:DropDownList 
    AutoPostBack="true" 
    ID="DropDownList1" 
    runat="server">
  <asp:ListItem Value="0">0</asp:ListItem>
  <asp:ListItem Value="25">25</asp:ListItem>
  <asp:ListItem Value="100">100</asp:ListItem>
  <asp:ListItem Value="400">400</asp:ListItem>
</asp:DropDownList>
<asp:LinqDataSource 
    ContextTypeName="ExampleDataContext" 
    TableName="Products" 
    Where="Price > @UserPrice"
    ID="LinqDataSource1" 
    runat="server">
  <WhereParameters>
    <asp:ControlParameter 
      Name="UserPrice" 
      DefaultValue="0" 
      ControlID="DropDownList1" 
      Type="Int32" />
  </WhereParameters>
</asp:LinqDataSource>
<asp:GridView 
    DataSourceID="LinqDataSource1"
    ID="GridView1" 
    runat="server">
</asp:GridView>

Дополнительные сведения см. в разделе AutoGenerateWhereClause.

Группировка и агрегирование данных

Можно группировать записи, имеющие одинаковые значения в одном или нескольких столбцах. Для этого установите в качестве значения свойства GroupBy имена свойств, которые требуется использовать для группировки данных. Например, чтобы сгруппировать записи с одинаковым названием города из таблицы, содержащей адреса, присвойте свойству GroupBy значение City.

Для сгруппированных данных можно вычислить определенные значения, например среднее или сумму значений свойства, с помощью статистических функций в сочетании со свойством GroupBy. Значения, которые использовались для группировки, извлекаются с помощью объекта Key.

Следующий пример показывает группировку данных по свойству ProductCategory. Сгруппированные значения извлекаются путем включения Key в свойство Select. Статистические методы Average и Count также включаются в свойство Select.

<asp:LinqDataSource 
  ContextTypeName="ExampleDataContext" 
  TableName="Products" 
  GroupBy="ProductCategory"
  Select="new(Key, 
    Average(ListPrice) As AverageListPrice, 
    Average(Cost) As AverageCost, 
    Count() As RecordCount)"
  ID="LinqDataSource1" 
  runat="server">
</asp:LinqDataSource>

Отдельные записи, входящие в группу, извлекаются с помощью ключевого слова It. Дополнительные сведения см. в разделе Практическое руководство. Группирование и агрегирование данных с помощью элемента управления LinqDataSource.

Статистические методы

В следующей таблице перечислены статистические методы, доступные при использовании элемента управления LinqDataSource.

Статистическая функция

Описание

Count()

Возвращает общее число записей в наборе данных.

Average(столбец)

Возвращает среднее значение указанного столбца для всех записей результирующего набора.

Sum(столбец)

Возвращает сумму значений указанного столбца для всех записей результирующего набора.

Max(столбец)

Возвращает максимальное значение указанного столбца среди записей результирующего набора.

Min(столбец)

Возвращает минимальное значение указанного столбца среди записей результирующего набора.

Where(условие)

Фильтрует возвращаемые записи на основе заданного условия.

Any()

Определяет, содержит ли коллекция записи.

All(условие)

Определяет, все ли записи в коллекции удовлетворяют указанному условию.

Обновление, вставка и удаление данных

Можно настроить элемент управления LinqDataSource для автоматического создания команд обновления, вставки и удаления данных. Чтобы включить автоматическое обновление данных, установите свойство EnableUpdate, EnableInsert или EnableDelete в true.

Bb547113.alert_note(ru-ru,VS.90).gifПримечание.

Если требуется, чтобы элемент управления LinqDataSource автоматически генерировал команды обновления, не устанавливайте свойство Select. Если свойство Select установлено, элемент управления LinqDataSource возвращает объект, представляющий собой экземпляр динамического класса. Он не является экземпляром класса, который представляет таблицу базы данных. Поэтому динамический класс не может определить, как обновлять значения в таблице базы данных.

Если необходимо программно задать обновление каких-либо значений, создайте обработчики событий Updating, Inserting или Deleting. В обработчике установите требуемое значение перед обработкой данных. Дополнительные сведения см. в разделе Практическое руководство. Обновление, вставка и удаление данных с использованием элемента управления LinqDataSource.

Сортировка данных

Объект LinqDataSource поддерживает два способа сортировки данных из запроса: можно сортировать данные по статическим значениям при разработке веб-страницы, а также предоставить пользователям возможность сортировать данные динамически во время выполнения.

Чтобы упорядочить данные в соответствии со статическими значениями, присвойте OrderBy имя требуемого свойства. Чтобы позволить пользователям сортировать данные во время выполнения, присвойте свойству AutoSort значение true (это значение по умолчанию). Затем передайте выражение сортировки элементу управления LinqDataSource. Элемент управления с привязкой к данным, например GridView, передаст выражение сортировки при назначении его свойству AllowSorting значения true.

Чтобы задать в свойстве OrderBy имена нескольких столбцов, перечислите эти имена через запятую. Например, если указать "LastName, FirstName", записи будут сначала упорядочены по LastName, а затем записи, содержащие совпадающие значения в поле LastName, будут упорядочены по FirstName.

Можно использовать оба способа сортировки, если требуется сначала вернуть данные в определенном порядке, а затем позволить пользователю его изменить. В этом случае присвойте свойству AutoSort значение true, а свойству OrderBy — имя нужного свойства.

В следующем примере элемент управления LinqDataSource сначала упорядочивает записи по полю LastName, затем по FirstName и, наконец, по MiddleName. Также конфигурируется элемент управления LinqDataSource, разрешая пользователям выполнять динамическую сортировку строк. Можно связать элемент управления данными, например GridView, с элементом управления LinqDataSource, чтобы отобразить данные и позволить пользователям изменять порядок сортировки.

<asp:LinqDataSource
  ContextTypeName="ExampleDataContext"
  TableName="Contact"
  OrderBy="LastName, FirstName, MiddleName"
  AutoSort="true"
  ID="LinqDataSource1"
  runat="server"
</asp:LinqDataSource>

Использование параметров для динамического вычисления значений

При использовании элемента управления LinqDataSource можно использовать параметры для задания значений, которые необходимо интерпретировать или преобразовать во время выполнения. В отличие от других элементов управления источниками данных, здесь не требуется указывать каждое значение, являющееся частью операции обновления, вставки или удаления. Элемент управления LinqDataSource автоматически устанавливает эти значения и использует LINQ to SQL для создания команд SQL. Разработчик задает параметры только для предоставления значений по умолчанию или для преобразования пустых значений. Можно также использовать WhereParameters и коллекции параметров OrderByParameters для сортировки или фильтрации данных в зависимости от значений во время выполнения. Дополнительные сведения о LINQ to SQL см. в разделе LINQ to SQL.

Элемент управления LinqDataSource содержит следующие коллекции параметров:

Пример использования коллекции WhereParameters для предоставления пользователям возможности динамической фильтрации записей, возвращаемых LinqDataSource, см. выше в подразделе Фильтрация данных с помощью предложения WHERE.

Контроль параллелизма

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

Элемент управления LinqDataSource позволяет определить, изменились ли данные. Этот элемент управления хранит значения исходных данных в состоянии представления веб-страницы. Когда веб-страница выполняет обратный запрос, она содержит и исходные значения, и все обновленные значения. Элемент управления LinqDataSource использует LINQ to SQL для сравнения исходных значений с текущими значениями в источнике данных. Если значения одинаковы, значит, данные не изменились и LINQ to SQL обновит или удалит данные. Если данные были изменены, LINQ to SQL создаст исключение.

Можно указать вручную, значения каких столбцов должны проверяться, назначив в классе сущности свойству UpdateCheck требуемый столбец. Когда Сред. Объектно-реляционный конструктор создает код для таблицы базы данных, он присваивает свойству UpdateCheck значение Never для столбцов, управление которыми выполняет база данных. Значения для других столбцов установлено в Always; это означает, что для них всегда выполняется проверка на параллелизм. Присвойте свойству UpdateCheck значение Never, чтобы колонка не участвовала в проверке на параллелизм. Присвоение свойству значения Never также запрещает сохранение значений столбца в состоянии представления. Чтобы проверка значения по отношению к источнику данных выполнялась только при изменении этого значения пользователем, присвойте свойству UpdateCheck значение WhenChanged.

Если необходимо хранить конфиденциальные данные в состоянии представления, его следует шифровать. Дополнительные сведения см. в разделе Шифрование ViewState в ASP.NET 2.0.

Bb547113.alert_note(ru-ru,VS.90).gifПримечание.

Шифрование состояния представления может повлиять на скорость работы веб-страницы.

Проверки на оптимистичный параллелизм для данных SQL Server

Хранение большого количества значений в состоянии представления может увеличить размер веб-страницы и потенциально раскрывает пользователям конфиденциальные данные. При работе с информацией из базы данных SQL Server можно повысить скорость работы и уровень безопасности веб-страницы путем создания в базе данных столбца, который будет содержать временные метки. SQL Server автоматически обновляет столбец временных меток при каждом изменении записи. В этом случае элементу управления LinqDataSource не потребуется сравнивать каждый столбец в записи, чтобы определить, изменилась ли запись. Вместо этого он может сравнить только временные метки в состоянии представления с временными метками в базе данных.

Если добавить столбец временных меток в базу данных SQL Server, Сред. Объектно-реляционный конструктор автоматически создает класс сущности для того, чтобы в состоянии представления сохранялись только временные метки. Дополнительные сведения см. в разделе Пошаговое руководство. Использование временной метки с управляющим элементом LinqDataSource для проверки целостности данных.

Использование хранимых процедур

Чтобы воспользоваться элементом управления LinqDataSource для извлечения данных из хранимой процедуры, создайте обработчик события Selecting. В обработчике событий вызовите метод класса контекста данных, который представляет хранимую процедуру. Затем назначьте результат хранимой процедуры свойству Result объекта LinqDataSourceSelectEventArgs. Если требуется разрешить операции автоматического обновления, вставки и удаления, тогда тип, возвращенный методом, должен соответствовать типу, который указан в свойстве TableName.

В следующем примере демонстрируется присвоение свойству Result объекта, возвращаемого методом, который представляет хранимую процедуру.

Protected Sub LinqDataSource_Selecting(ByVal sender As Object, _
        ByVal e As LinqDataSourceSelectEventArgs)
    Dim exampleContext As ExampleDataContext = New ExampleDataContext()
    e.Result = exampleContext.GetRegisteredCustomers()
End Sub
protected void LinqDataSource_Selecting(object sender, 
        LinqDataSourceSelectEventArgs e)
{
    ExampleDataContext exampleContext = new ExampleDataContext();
    e.Result = exampleContext.GetRegisteredCustomers();
}

Дополнительные сведения о создании методов контекста данных см. в разделе Как создать методы DataContext, сопоставленные с хранимыми процедурами и функциями (реляционный конструктор объектов).

Проверка значений при изменении данных

Перед изменением записи данных, возможно, потребуется проверить ее значения. Как правило, проверки включаются в класс данных, а не в веб-страницу. Путем централизации проверок в классе данных, разработчик может быть уверен, что проверки будут выполнены независимо от того, как используется класс данных. Дополнительные сведения о добавлении проверок в классы см. в разделах Как добавить проверку в классы сущностей и Пошаговое руководство. Добавление проверки в классы сущностей.

Исключения проверки возникают перед тем, как данные обновляются, вставляются или удаляются. Чтобы извлечь исключения проверки, создайте обработчики событий Inserting, Updating и Deleting. Дополнительные сведения см. в описании классов LinqDataSourceUpdateEventArgs, LinqDataSourceInsertEventArgs и LinqDataSourceDeleteEventArgs.

События элемента управления LinqDataSource

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

При выборке данных элемент управления LinqDataSource вызывает следующие события (в указанном порядке):

  1. Selecting

  2. ContextCreating (при необходимости)

  3. ContextCreated (при необходимости)

  4. Selected

  5. ContextDisposing

Если разработчик программно создает объект контекста в событии Selecting и не требуется хранить исходные значения в состоянии представления, события ContextCreating и ContextCreated не вызываются.

При обновлении, вставке или удалении данных элемент управления LinqDataSource вызывает следующие события (в указанном порядке):

  1. ContextCreating

  2. ContextCreated

  3. Inserting, или Updating, или Deleting

  4. Inserted, или Updated, или Deleted

  5. ContextDisposing

Порядок возникновения событий в операциях обновления, удаления и вставки отличается от порядка в операции выборки. Это обусловлено тем, что элемент управления LinqDataSource должен получить экземпляр объекта данных и передать его в событие Inserting, Updating или Deleting.

События Selecting, Inserting, Updating и Deleting вызываются перед выполнением операции с данными. Обработчики этих событий создаются для проверки и изменения значений перед выполнением операции или для ее отмены. Например, если база данных содержит столбец, в котором хранятся сведения о пользователе, последним изменившим запись, можно использовать событие Updating для программного задания имени пользователя.

События Selected, Inserted, Updated и Deleted возникают после завершения операции. Обработчики этих событий создаются для перехвата исключений и проверки значений, возвращаемых операцией.

Событие ContextCreating возникает перед тем, как элемент управления LinqDataSource создает тип, указанный в свойстве ContextTypeName. Это событие обрабатывается, если необходимо программно создать тип контекста, например, в том случае, если конструктор типа контекста требует параметры. Событие ContextCreated возникает после создания типа, указанного в свойстве ContextTypeName. Это событие обрабатывается для перехвата исключений или для проверки созданного объекта контекста. Событие ContextDisposing возникает перед тем, как элемент управления LinqDataSource удаляет тип контекста, указанный в свойстве ContextTypeName. В обработчике этого события можно отменить удаление объекта, создание которого требует серьезных затрат времени и ресурсов. Можно также использовать это событие для выполнения специфичной для объекта очистки перед его уничтожением.

К началу

Примеры кода

Пошаговое руководство. Извлечение, обновление, вставка и удаление данных с помощью элементов управления LinqDataSource и DetailsView

Пошаговое руководство. Выбор и фильтрация подмножества данных с помощью элементов управления LinqDataSource и GridView

Пошаговое руководство. Использование временной метки с управляющим элементом LinqDataSource для проверки целостности данных

Практическое руководство. Группирование и агрегирование данных с помощью элемента управления LinqDataSource

Практическое руководство. Обновление, вставка и удаление данных с использованием элемента управления LinqDataSource

К началу

Ссылки на классы

В следующей таблице перечислены основные классы, связанные с классом LinqDataSource.

Член

Описание

LinqDataSource

Применяет выражения LINQ к источнику данных и представляет данные для элементов управления с привязкой к данным.

LinqDataSourceView

Поддерживает элемент управления LinqDataSource и предоставляет элементам управления с привязкой к данным интерфейс для выполнения операций с объектами данных. Этот класс предназначен, в первую очередь, для использования элементами управления с привязкой к данным, а не в качестве программируемого объекта в коде страницы.

LinqDataSourceDisposeEventArgs

Предоставляет данные для события ContextDisposing.

LinqDataSourceContextEventArgs

Предоставляет данные для события ContextCreating.

LinqDataSourceDeleteEventArgs

Предоставляет данные для события Deleting.

LinqDataSourceInsertEventArgs

Предоставляет данные для события Inserting.

LinqDataSourceSelectEventArgs

Предоставляет данные для события Selecting.

LinqDataSourceStatusEventArgs

Предоставляет данные для событий ContextCreated, Deleted, Inserted, Selected и Updated.

LinqDataSourceUpdateEventArgs

Предоставляет данные для события Updating.

К началу

См. также

Другие ресурсы

LINQ

LINQ to SQL

Реляционный конструктор объектов