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

Visual Studio 2010

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

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

Доступ к данным в этом пошаговом руководстве демонстрируется, в основном, за счет выбора значений из таблицы Product образца базы данных AdventureWorks. В этой таблице содержатся столбцы, являющиеся внешними ключами для других таблиц; данные, таким образом, извлекаются из этих связанных таблиц.

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

Для реализации процедур, представленных в данном пошаговом руководстве, потребуется:

  • Visual Studio 2008 или Visual Web Developer, экспресс-выпуск.

  • Веб-узел ASP.NET.

  • SQL Server, экспресс-выпуск. Также можно использовать SQL Server при условии внесения изменений в некоторые процедуры.

  • На компьютере установлена база данных AdventureWorks. Для загрузки базы данных AdventureWorks посетите страницу SQL Server 2005 Samples and Sample Databases.

  • Строка подключения веб-узла, которая соединяется с базой данных AdventureWorks.

Для работы с данными базы данных с помощью элемента управления LinqDataSource создаются классы, представляющие сущности баз данных. Для создания этих классов можно использовать инструмент Visual Studio 2008.

Создание классов для таблиц базы данных AdventureWorks

  1. Если веб-узел еще не содержит папку App_Code, то в Обозревателе решений щелкните правой кнопкой мыши название проекта, нажмите кнопку Добавить папку ASP.NET и затем нажмите App_Code.

  2. Щелкните правой кнопкой мыши папку App_Code и выберите команду Добавить новый элемент.

    Откроется диалоговое окно Добавление нового элемента.

  3. В разделе Установленные шаблоны Visual Studio выберите LINQ to SQL Classes, назовите файл AdventureWorks.dbml и нажмите Добавить.

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

  4. В Обозревателе сервера перетащите таблицу Product (Production) в окно Реляционный конструктор объектов.

    Таблица Product (Production) и ее столбцы представляются в окне конструктора в виде сущности Product.

  5. Перетащите таблицы ProductSubCategory и UnitMeasure в окно конструктора.

    Эти таблицы и ее столбцы представляются в окне конструктора в виде сущностей. Связь между таблицей Product и двумя другими таблицами показана с помощью пунктирной линии.

    Просмотрите три таблицы в реляционном конструкторе объектов
  6. Сохраните файл AdventureWorks.dbml.

  7. В Обозревателе решений откройте файл AdventureWorks.designer.cs или AdventureWorks.designer.vb.

    Файл содержит классы под названием AdventureWorksDataContext, Product, ProductSubCategory и UnitMeasure. В классе Product присутствуют свойства ProductSubcategory, UnitMeasure и UnitMeasure1, помеченные, как внешние ключи с помощью атрибута AssociationAttribute. Эти свойства возвращают объекты, представляющие таблицы ProductSubCategory и UnitMeasure.

    Свойство UnitMeasure представляет связь с внешним ключом значения в столбце SizeUnitMeasureCode. Свойство UnitMeasure1 представляет внешний ключ для столбца WeightUnitMeasureCode.

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

Извлечение подмножества данных с помощью элемента управления LinqDataSource

  1. Создайте новую страницу ASP.NET в Visual Studio и перейдите в режим исходного кода.

  2. C вкладки Данные панели элементов перетащите элемент управления LinqDataSource в элемент управления formна веб-странице.

    В качестве свойства идентификатора можно оставить LinqDataSource1.

  3. Задайте свойству ContextTypeName значение AdventureWorksDataContext.

    Класс AdventureWorksDataContext — это класс контекста данных, представляющий базу данныхAdventureWorks. Он содержит свойство для каждой таблицы базы данных.

  4. Задайте для свойства TableName значение Products.

  5. Установите для свойства Select следующее значение:

    new(Name, Size, StandardCost, ListPrice, DaysToManufacture)
    

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

Если значение для свойства Where не задано, элемент управления LinqDataSource возвращает все записи из таблицы базы данных. Чтобы установить фильтрацию возвращаемых записей, задайте свойство Where. Если провести фильтрацию по статическому значению, например, ListPrice > 0, будут возвращены только те записи, в которых значение свойства ListPrice больше нуля. Также можно присвоить значение во время выполнения, добавив параметры в коллекцию WhereParameters.

Фильтрация данных во время выполнения с помощью элемента управления LinqDataSource

  1. Добавьте на веб-страницу элемент управления DropDownList и установите для его свойства AutoPostBack значение true.

    Оставьте имя по умолчанию DropDownList1.

  2. Добавьте четыре элемента списка к элементу управления DropDownList1 и укажите 0, 25, 100 и 400 в качестве значений этих элементов.

  3. Поместите элемент WhereParameters между открывающими и закрывающими тегами элемента управления LinqDataSource.

  4. Добавьте элемент ControlParameter в коллекцию WhereParameters.

  5. Присвойте свойству ControlID элемента управления ControlParameter значение DropDownList1, свойству Name — значение SelectedPrice, а свойству Type — значение Int32.

    Во время выполнения параметр SelectedPrice будет содержать выбранное значение из DropDownList1.

  6. Если задать свойству Where значение ListPrice > @SelectedPrice, то будут выбраны только те записи, где значение ListPrice превышает значение, выбранное пользователем.

    В примере далее показана декларативная разметка для элементов управления DropDownList и LinqDataSource.

    <asp:DropDownList AutoPostBack="true" ID="DropDownList1" runat="server">
      <asp:ListItem Value="0"></asp:ListItem>
      <asp:ListItem Value="25"></asp:ListItem>
      <asp:ListItem Value="100"></asp:ListItem>
      <asp:ListItem Value="400"></asp:ListItem>
    </asp:DropDownList>
    <asp:LinqDataSource 
      ContextTypeName="AdventureWorksDataContext" 
      TableName="Products" 
      Where="ListPrice > @SelectedPrice" 
      Select="new(Name, Size, StandardCost, ListPrice, DaysToManufacture)" 
      ID="LinqDataSource1" 
      runat="server">
      <WhereParameters>
        <asp:ControlParameter 
          Name="SelectedPrice" 
          DefaultValue="0" 
          ControlID="DropDownList1" 
          Type="Int32" />
      </WhereParameters>
    </asp:LinqDataSource>
    

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

Отображение подмножества данных в элементе управления GridView

  1. На вкладке Данные панели элементов дважды щелкните элемент управления GridView, чтобы добавить его на страницу.

  2. Присвойте свойству DataSourceID элемента управления GridView значение LinqDataSource1.

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

  3. Присвойте свойствам AllowPaging и AllowSorting значение true.

    Для поддержки работы функций сортировки и разбиения по страницам с элементом управления LinqDataSource необходимо присвоить свойствам AutoSort и AutoPage значение true. По умолчанию оба эти свойства имеют значение true.

  4. Установите для свойства AutoGenerateColumns значение false.

  5. Чтобы определить порядок столбцов, создайте элемент управления BoundField для каждого свойства (Name, Size, StandardCost, ListPrice и DaysToManufacture), заданного в свойстве Where элемента управления LinqDataSource.

    В примере далее показана декларативная разметка для элемента управления GridView.

    <asp:GridView 
      AllowPaging="true" 
      AllowSorting="true" 
      AutoGenerateColumns="false" 
      DataSourceID="LinqDataSource1" 
      ID="GridView1" 
      runat="server">
      <Columns>
        <asp:BoundField 
            DataField="Name" 
            HeaderText="Name" 
            SortExpression="Name" />
        <asp:BoundField 
            DataField="Size" 
            HeaderText="Size" 
            SortExpression="Size" />
        <asp:BoundField 
            DataField="StandardCost" 
            HeaderText="Standard Cost" 
            SortExpression="StandardCost" />
        <asp:BoundField 
            DataField="ListPrice" 
            HeaderText="List Price" 
            SortExpression="ListPrice" />
        <asp:BoundField 
            DataField="DaysToManufacture" 
            HeaderText="Days To Manufacture" 
            SortExpression="DaysToManufacture" />
      </Columns>
    </asp:GridView>
    
  6. Сохраните страницу и нажмите клавиши CTRL + F5 для отображения страницы в обозревателе.

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

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

Вычисление и отображение новых значений из источника данных

  1. Задайте для свойства Select следующее значение:

    new(Name, 
        Size, 
        StandardCost, 
        ListPrice, 
        ListPrice - StandardCost as PriceDifference, 
        DaysToManufacture / 5.0 as WeeksToManufacture)
    

    В базе данных отсутствуют дополнительные значения PriceDifference и WeeksToManufacture. Их отображение возможно только после выполнения вычислений на основе значений базы данных.

  2. В элемент управления GridView добавьте элементы управления BoundField для столбцов PriceDifference и WeeksToManufacture, а затем удалите элемент управления BoundField для DaysToManufacture.

    В следующем примере показана декларативная разметка для вычисленных элементов управления BoundField.

        <asp:BoundField 
            DataField="PriceDifference" 
            HeaderText="Price Difference" 
            SortExpression="Price Difference" />
        <asp:BoundField 
            DataField="WeeksToManufacture" 
            HeaderText="Weeks To Manufacture" 
            SortExpression="WeeksToManufacture" />
    
  3. Сохраните страницу и нажмите клавиши CTRL + F5 для отображения страницы в обозревателе.

    Элемент управления GridView отображает столбцы для текущих записей и вычисленные значения из таблицы Product.

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

Извлечение данных из связанных таблиц

  1. Задайте свойству Select элемента управления LinqDataSource следующее значение:

    new(Name, 
        Size, 
        UnitMeasure.Name as SizeMeasureName, 
        Weight, 
        UnitMeasure1.Name as WeightMeasureName, 
        ProductSubcategory.Name as SubCategoryName)
    

    Свойства SizeMeasureName, WeightMeasureName и SubCategoryName содержат значения из таблиц с отношениями внешнего ключа с таблицей Products.

  2. Чтобы запрос возвращал только те продукты, в качестве единицы измерения которых используется размер или вес, установите для свойства Where следующее значение:

    WeightUnitMeasureCode != null || SizeUnitMeasureCode != null
    

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

    В следующем примере показана декларативная разметка для элемента управления LinqDataSource.

    <asp:LinqDataSource 
      ContextTypeName="AdventureWorksDataContext" 
      TableName="Products" 
      Where="WeightUnitMeasureCode != null || 
             SizeUnitMeasureCode != null"
      Select="new(Name,
                  Size, 
                  UnitMeasure.Name as SizeMeasureName, 
                  Weight, 
                  UnitMeasure1.Name as WeightMeasureName, 
                  ProductSubCategory.Name as SubCategoryName)" 
      ID="LinqDataSource1" 
      runat="server">
    </asp:LinqDataSource>
    
  3. Добавьте в элемент управления GridView элемент управления BoundField для каждого из отображаемых столбцов. К числу таких столбцов относится Name, Size, SizeMeasureName, Weight, WeightMeasureName и SubCategoryName.

    В примере далее показана декларативная разметка для элемента управления GridView.

    <asp:GridView 
      AllowPaging="true" 
      AllowSorting="true" 
      AutoGenerateColumns="false" 
      DataSourceID="LinqDataSource1" 
      ID="GridView1" 
      runat="server">
      <Columns>
        <asp:BoundField 
              DataField="Name" 
              HeaderText="Name" 
              SortExpression="Name" />
        <asp:BoundField 
              DataField="Size" 
              HeaderText="Size" 
              SortExpression="Size" />
        <asp:BoundField 
              DataField="SizeMeasureName" 
              HeaderText="Size Unit of Measurement" 
              SortExpression="SizeMeasureName" />
        <asp:BoundField 
              DataField="Weight" 
              HeaderText="Weight" 
              SortExpression="Weight" />
        <asp:BoundField 
              DataField="WeightMeasureName" 
              HeaderText="Weight Unit of Measurement" 
              SortExpression="WeightMeasureName" />
        <asp:BoundField 
              DataField="SubCategoryName" 
              HeaderText="Subcategory Name" 
              SortExpression="SubCategoryName" />
      </Columns>
    </asp:GridView>
    
  4. Сохраните страницу и нажмите клавиши CTRL + F5 для отображения страницы в обозревателе.

    Элемент управления GridView отображает значения из таблиц Product, ProductSubCategory и UnitMeasure. Поддерживается сортировка и пролистывание результатов.

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

Показ: