Tutorial: Seleccionar y filtrar un subconjunto de datos con los controles LinqDataSource y GridView
Actualización: noviembre 2007
En este tutorial se describe cómo usar el control LinqDataSource para crear un conjunto de datos que no se limitan a los valores de una única tabla de base de datos. Usará un control LinqDataSource para seleccionar un subconjunto de datos de la tabla, calcular nuevos valores a partir de los valores seleccionados y recuperar valores de tablas relacionadas. También filtrará qué registros se devuelven. A continuación mostrará el nuevo conjunto de valores con un control GridView.
El tutorial muestra el acceso a datos mediante la selección de valores principalmente en la tabla Product de la base de datos de ejemplo de AdventureWorks. Esta tabla contiene columnas que son claves externas a otras tablas; recuperará datos de esas tablas relacionadas.
Usará Diseñador relacional de objetos para crear una clase que represente las tablas de base de datos que contienen los valores. El control LinqDataSource interactuará con esta clase generada para recuperar y actualizar los datos.
Requisitos previos
Para implementar los procedimientos de este tutorial necesitará:
Visual Studio 2008 o Visual Web Developer Express.
Un sitio Web de ASP.NET.
SQL Server Express Edition. Si tiene SQL Server instalado, puede usarlo, pero debe realizar pequeños ajustes en algunos procedimientos.
La base de datos de AdventureWorks instalada en su equipo. Para descargar la base de datos de AdventureWorks, vea SQL Server 2005 Samples and Sample Databases.
Una cadena de conexión en el sitio web que conecte a la base de datos de AdventureWorks.
Crear clases para representar entidades de base de datos
Para trabajar con datos de la base de datos mediante el control LinqDataSource, debe crear clases que representen entidades de base de datos. Puede usar una herramienta de Visual Studio 2008 para crear estas clases.
Para crear las clases de las tablas de base de datos de AdventureWorks
Si el sitio web no tiene todavía una carpeta App_Code, en el Explorador de soluciones, haga clic con el botón secundario en el nombre del proyecto, haga clic en Agregar carpeta ASP.NET y, a continuación, en App_Code.
Haga clic con el botón secundario del mouse en la carpeta App_Code y, a continuación, haga clic en Agregar nuevo elemento.
Se abrirá el cuadro de diálogo Agregar nuevo elemento.
En Plantillas instaladas de Visual Studio, seleccione LINQ a clases SQL, denomine AdventureWorks.dbml al archivo y, a continuación, haga clic en Agregar.
Se muestra el Diseñador relacional de objetos.
En el Explorador de servidores, arrastre la tabla Product (Production) a la ventana Diseñador relacional de objetos.
La tabla Product (Production) y sus columnas se representan en la ventana del diseñador como una entidad denominada Product.
Arrastre las tablas ProductSubCategory y UnitMeasure a la ventana del diseñador.
Estas tablas y sus columnas se representan como entidades en la ventana del diseñador. La relación entre Product y las dos tablas relacionadas se muestra con la línea de puntos.
Guarde el archivo AdventureWorks.dbml.
En el Explorador de soluciones, abra el archivo AdventureWorks.designer.cs o AdventureWorks.designer.vb.
El archivo incluye las clases denominadas AdventureWorksDataContext, Product, ProductSubCategoryy UnitMeasure. La clase Product contiene las propiedades ProductSubcategory, UnitMeasure y UnitMeasure1. Estas propiedades se marcan como claves externas con el atributo AssociationAttribute. Devuelven objetos que representan las tablas ProductSubCategory y UnitMeasure.
La propiedad UnitMeasure representa la relación de clave externa del valor en la columna SizeUnitMeasureCode. La propiedad UnitMeasure1 representa la clave externa de la columna WeightUnitMeasureCode.
Seleccionar las columnas que se recuperan
Si no especifica un valor para la propiedad Select, el control LinqDataSource devuelve todas las propiedades (columnas) de la clase que representa la tabla de base de datos.
Para recuperar un subconjunto de datos con el control LinqDataSource
En Visual Studio, cree una nueva página web ASP.NET y cambie a la vista Código fuente.
En la ficha Datos del cuadro de herramientas, arrastre un control LinqDataSource y colóquelo dentro del elemento form de la página web.
Puede dejar la propiedad ID como LinqDataSource1.
Establezca la propiedad ContextTypeName en AdventureWorksDataContext.
La clase AdventureWorksDataContext es una clase de contexto de datos que representa la base de datos de AdventureWorks. Contiene una propiedad para cada tabla de la base de datos.
Establezca la propiedad TableName en Products.
Establezca la propiedad Select en el valor que se indica a continuación:
new(Name, Size, StandardCost, ListPrice, DaysToManufacture)
Al establecer la propiedad Select, restringe las propiedades que se recuperan de la clase Products. Al seleccionar más de una propiedad de una clase, debe agregar las propiedades en el operador new. Esto se debe a que el control LinqDataSource no devuelve una instancia de la clase especificada en la propiedad TableName. En realidad, devuelve una instancia de una clase creada dinámicamente que sólo contiene estas propiedades.
Filtrar los registros que se recuperan
Si no especifica un valor para la propiedad Where, el control LinqDataSource devuelve todos los registros de la tabla de base de datos. Puede filtrar los registros que se devuelven si establece la propiedad Where. Puede filtrar por un valor estático como ListPrice > 0 para devolver únicamente los registros con el valor de la propiedad ListPrice mayor que cero. También puede asignar un valor en tiempo de ejecución si agrega parámetros a la colección WhereParameters.
Para filtrar los datos en tiempo de ejecución con el control LinqDataSource
Agregue un control DropDownList a la página web y establezca su propiedad AutoPostBack en true.
Conserve el nombre predeterminado DropDownList1.
Agregue cuatro elementos de lista al control DropDownList1 y establezca sus valores en 0, 25, 100 y 400.
Agregue un elemento WhereParameters entre las etiquetas de apertura y cierre del control LinqDataSource.
Agregue un control ControlParameter a la colección WhereParameters.
Establezca la propiedad ControlID del control ControlParameter en DropDownList1, establezca la propiedad Name en SelectedPrice y establezca la propiedad Type en Int32.
En tiempo de ejecución, el parámetro SelectedPrice contendrá el valor seleccionado de DropDownList1.
Establezca la propiedad Where en ListPrice > @SelectedPrice para seleccionar sólo los registros cuyo valor ListPrice sea mayor que el valor seleccionado por el usuario.
En el ejemplo siguiente se muestra el marcado declarativo de los controles DropDownList y LinqDataSource.
<asp:DropDownList AutoPostBack="true" ID="DropDownList1" > <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" > <WhereParameters> <asp:ControlParameter Name="SelectedPrice" DefaultValue="0" ControlID="DropDownList1" Type="Int32" /> </WhereParameters> </asp:LinqDataSource>
Agregar un control para mostrar datos
Ahora puede agregar un control GridView y enlazarlo al control LinqDataSource. El control GridView permite a los usuarios ver filas de datos administrados por el control LinqDataSource. Permitirá a los usuarios clasificar los datos y desplazarse en las páginas de datos.
Para mostrar el subconjunto de datos en el control GridView
En la ficha Datos del Cuadro de herramientas, haga doble clic en el control GridView para agregarlo a la página.
Establezca la propiedad DataSourceID del control GridView en LinqDataSource1.
De esta forma enlaza el control GridView a los datos devueltos por el control LinqDataSource.
Establezca las propiedades AllowPaging y AllowSorting en true.
Para ordenar y paginar para trabajar con un control LinqDataSource, las propiedades AutoSort y AutoPage deben ser true. De forma predeterminada, ambos valores son true.
Establezca la propiedad AutoGenerateColumns en false.
Para especificar el orden de las columnas, cree un control BoundField para cada propiedad (Name, Size, StandardCost, ListPricey DaysToManufacture) que especificó en la propiedad Where del control LinqDataSource.
En el ejemplo siguiente se muestra el marcado declarativo del control GridView.
<asp:GridView AllowPaging="true" AllowSorting="true" AutoGenerateColumns="false" DataSourceID="LinqDataSource1" ID="GridView1" > <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>
Guarde la página y presione CTRL+F5 para verla en un explorador.
El control GridView muestra las columnas de los registros actuales de la tabla Product. Puede ordenar los registros si hace clic en los encabezados de columna y puede paginar a través de los registros si hace clic en los números de página.
Usar valores del origen de datos para calcular nuevos valores
Además de seleccionar valores de la tabla de base de datos, puede calcular nuevos valores. Por ejemplo, puede hacerlo si desea mostrar un valor que sólo se puede derivar realizando un cálculo en un valor del origen de datos. A continuación puede mostrar estos valores en el control GridView.
Para calcular y mostrar nuevos valores a partir del origen de datos
Cambie el valor de la propiedad Select para que muestre lo siguiente:
new(Name, Size, StandardCost, ListPrice, ListPrice - StandardCost as PriceDifference, DaysToManufacture / 5.0 as WeeksToManufacture)
Los valores adicionales, PriceDifference y WeeksToManufacture, no existen en la base de datos. Sólo se pueden mostrar una vez realizado un cálculo en los valores de la base de datos.
En el control GridView, agregue controles BoundField para las columnas PriceDifference y WeeksToManufacture, y quite el control BoundField de DaysToManufacture.
En el ejemplo siguiente se muestra el marcado declarativo de los controles BoundField calculados.
<asp:BoundField DataField="PriceDifference" HeaderText="Price Difference" SortExpression="Price Difference" /> <asp:BoundField DataField="WeeksToManufacture" HeaderText="Weeks To Manufacture" SortExpression="WeeksToManufacture" />
Guarde la página y presione CTRL+F5 para verla en un explorador.
El control GridView muestra las columnas de los registros actuales y los valores calculados a partir de la tabla Product.
Seleccionar valores de tablas relacionadas
Puede recuperar los valores de una tabla y valores de cualquier tabla relacionada con un control LinqDataSource. Cuando una tabla tiene una relación de clave externa con otras tablas, Diseñador relacional de objetos genera una clase de entidad que contiene propiedades para cada tabla relacionada. Estas propiedades devuelven un objeto que representa la tabla relacionada. A su vez, el objeto contiene las propiedades para todas las columnas de la tabla relacionada. Puede seleccionar valores de las tablas relacionadas si tiene acceso a los objetos de la clase que representan las tablas relacionadas.
Para recuperar datos de tablas relacionadas
Establezca la propiedad Select del control LinqDataSource con el siguiente valor:
new(Name, Size, UnitMeasure.Name as SizeMeasureName, Weight, UnitMeasure1.Name as WeightMeasureName, ProductSubcategory.Name as SubCategoryName)
Las propiedades SizeMeasureName, WeightMeasureName y SubCategoryName contienen valores de tablas con relaciones de clave externa con la tabla Products.
Para devolver sólo los productos que tienen una unidad de medida de tamaño o peso, establezca la propiedad Where con el siguiente valor:
WeightUnitMeasureCode != null || SizeUnitMeasureCode != null
Al filtrar estos valores se muestra cómo el control LinqDataSource administra las relaciones de clave externa. El operador || realiza una operación OR lógica. Por tanto, sólo se devuelven los registros con un valor asignado al menos en una de las claves externas.
En el ejemplo siguiente se muestra el marcado declarativo del control 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" > </asp:LinqDataSource>
En el control GridView, agregue un control BoundField para cada columna que desee mostrar. Estas columnas son Name, Size, SizeMeasureName, Weight, WeightMeasureName y SubCategoryName.
En el ejemplo siguiente se muestra el marcado declarativo del control GridView.
<asp:GridView AllowPaging="true" AllowSorting="true" AutoGenerateColumns="false" DataSourceID="LinqDataSource1" ID="GridView1" > <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>
Guarde la página y presione CTRL+F5 para verla en un explorador.
El control GridView muestra los valores de las tablas Product, ProductSubCategory y UnitMeasure. Puede ordenar y paginar a través de los registros.
Pasos siguientes
En este tutorial, ha aprendido a personalizar las columnas y registros que se devuelven en una consulta con el control LinqDataSource. Puede agregar más funciones al control LinqDataSource, como las siguientes:
Habilitar operaciones de actualización, inserción y eliminación. Para obtener más información, vea Tutorial: Recuperar, actualizar, insertar y eliminar datos con los controles LinqDataSource y DetailsView.
Agrupar datos y agregar valores, como calcular la suma o la media de valores de columna. Para obtener más información, vea Cómo: Agrupar y agregar datos utilizando el control LinqDataSource.
Asegurarse de que los datos de la base de datos no han cambiado entre el momento en que recupera los datos y el momento en que se actualizan o eliminan. Para obtener más información, vea Tutorial: Usar una marca de tiempo con el control LinqDataSource para comprobar la integridad de los datos.
Vea también
Conceptos
Información general sobre el control de servidor web LinqDataSource