Compartir a través de


Información general sobre el control de servidor web LinqDataSource

Actualización: noviembre 2007

El control LinqDataSource expone Language-Integrated Query (LINQ) a los desarrolladores web a través de la arquitectura de controles de origen de datos ASP.NET. LINQ proporciona un modelo de programación unificado para realizar consultas y actualizar datos de tipos diferentes de orígenes de datos y extiende directamente las funciones de datos en los lenguajes C# y Visual Basic. LINQ simplifica la interacción entre la programación orientada a objetos y los datos relacionales aplicando los principios de programación orientada a objetos a los datos relacionales. Para obtener más información sobre LINQ, vea Language-Integrated Query (LINQ).

Mediante el marcado declarativo, puede crear un control LinqDataSource que conecte con los datos de una base de datos o con una recolección de datos en memoria como una matriz. En el texto declarativo, puede escribir todas las condiciones que se requieren para recuperar, filtrar, ordenar y agrupar los datos. Al recuperar los datos de una tabla de base de datos SQL, puede configurar también un control LinqDataSource para administrar la actualización, inserción y eliminación de datos. El control realiza estas tareas sin requerir que se escriban comandos SQL para ello. La clase LinqDataSource proporciona también un modelo de eventos que permite administrar escenarios personalizados.

Este tema contiene:

  • Escenarios

  • Información general

  • Ejemplos de código

  • Referencia de clases

Escenarios

El control LinqDataSource se utiliza cuando se crea una página web que recupera o modifica datos y cuando se desea aprovechar el modelo de programación unificado proporcionado por LINQ. Puede simplificar el código de una página web permitiendo que el control LinqDataSource cree automáticamente los comandos para interactuar con los datos.

Volver al principio

Información general

El control LinqDataSource proporciona un medio de conectar un control de datos a una gran variedad de orígenes de datos. Entre estos orígenes se incluyen datos de base de datos, clases de orígenes de datos y colecciones en memoria. El control LinqDataSource permite especificar tareas de recuperación propias de una base de datos (seleccionar, agrupar y ordenar) para todos estos tipos de orígenes de datos. Puede especificar tareas de modificación (actualizar, eliminar e insertar) para tablas de base de datos.

Puede conectar el control LinqDataSource a cualquier tipo de recolección de datos almacenado en un campo o propiedad públicos. El marcado declarativo y el código para ejecutar operaciones de datos son los mismos para todos los orígenes de datos. No tiene que utilizar una sintaxis diferente al interactuar con datos de una tabla de base de datos o con datos de una recolección de datos como una matriz.

Para obtener una introducción al control LinqDataSource, vea Tutorial: Recuperar, actualizar, insertar y eliminar datos con los controles LinqDataSource y DetailsView.

Conectar con datos de una base de datos

Al interactuar con datos de una base de datos, no conecta directamente el control LinqDataSource a la base de datos. En lugar de ello, interactúa con clases de identidad que representan la base de datos y las tablas. Puede generar las clases de entidad a través de Diseñador relacional de objetos o ejecutando la utilidad SqlMetal.exe. Para obtener más información, vea Diseñador relacional de objetos (Diseñador R/O) o Herramienta de generación de código (SqlMetal.exe). Las clases de entidad que cree estarán ubicadas normalmente en la carpeta App_Code de la aplicación web. Diseñador relacional de objetos o la utilidad SqlMetal.exe generarán una clase que representa la base de datos y una clase para cada tabla de la base de datos.

La clase que representa la base de datos es responsable de recuperar y establecer los valores en el origen de datos. El control LinqDataSource lee y establece las propiedades de la clase que representa la tabla de datos. Para permitir operaciones de actualización, inserción y eliminación, la clase de base de datos debe derivar de la clase DataContext y la clase de tabla debe hacer referencia a una clase Table<TEntity>.

El control LinqDataSource se conecta a una clase de base de datos estableciendo la propiedad ContextTypeName en el nombre de la clase que representa la base de datos. El control LinqDataSource se conecta a una tabla determinada estableciendo la propiedad TableName en el nombre de la clase que representa la tabla de datos. Por ejemplo, para conectar con la tabla Contacts de la base de datos AdventureWorks, la propiedad ContextTypeName se establece en AdventureWorksDataContext (o el nombre que especifique para el objeto de base de datos). La propiedad TableName se establece en Contacts. En el ejemplo siguiente se muestra el marcado de un control LinqDataSource que conecta con la base de datos AdventureWorks.

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

En el ejemplo no se muestra la clase generada por Diseñador relacional de objetos, porque el código generado es demasiado largo para incluirlo en este tema. Sin embargo, para que el ejemplo funcione debe existir el código generado. Para obtener más información, vea Generación de código en LINQ to SQL.

Conectar con datos de una recolección en memoria

Al conectar con una recolección de datos en memoria como una matriz, la propiedad ContextTypeName se establece en el nombre de la clase que contiene la recolección. La propiedad TableName se establece en el nombre de la propia recolección.

En el ejemplo siguiente se muestra una clase que contiene una matriz de valores de cadena.

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;
        }
    }
}

En el ejemplo siguiente se muestra un control LinqDataSource que lee la lista de géneros de película de la clase del ejemplo anterior. Para recuperar la matriz de géneros, la propiedad ContextTypeName se establece en MovieLibrary y la propiedad TableName se establece en AvailableGenres.

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

Utilizar el control LinqDataSource con controles enlazados a datos

Para mostrar los datos de un control LinqDataSource, puede enlazar un control enlazado a datos al control LinqDataSource. Por ejemplo, puede enlazar los controles DetailsView, GridView o ListView a un control LinqDataSource. Para ello, debe establecer la propiedad DataSourceID del control enlazado a datos en el identificador del control LinqDataSource. En el ejemplo siguiente se utiliza un control GridView que muestra todos los datos de un control LinqDataSource.

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

El control enlazado a datos crea automáticamente la interfaz de usuario para mostrar los datos del control LinqDataSource. También puede proporcionar la interfaz para ordenar y paginar los datos. Cuando las modificaciones de datos están habilitadas, un control enlazado a datos proporciona la interfaz para actualizar, insertar y eliminar registros.

Puede restringir los datos (propiedades) que se muestran configurando el control enlazado a datos para que no genere automáticamente campos de control de datos. A continuación, puede definir explícitamente esos campos en el control enlazado a datos. El control LinqDataSource recupera todas las propiedades, pero el control enlazado a datos sólo muestra las propiedades especificadas. En el ejemplo siguiente se utiliza un control GridView que sólo muestra las propiedades Name y StandardCost de la tabla Products de la base de datos AdventureWorks. La propiedad AutoGenerateColumns se establece en false.

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

Si tiene que restringir las propiedades devueltas en la consulta, esas propiedades se definen estableciendo la propiedad Select del control LinqDataSource.

Comparación del control LinqDataSource con otros controles de origen de datos

El control LinqDataSource permite escribir menos código para realizar operaciones de datos en comparación con los controles SqlDataSource o ObjectDataSource. El control LinqDataSource puede deducir información sobre el origen de datos al que se conecta y crear dinámicamente los comandos para seleccionar, actualizar, insertar y eliminar datos. Asimismo, cuando se utiliza el control LinqDataSource, sólo es necesario conocer un modelo de programación para interactuar con tipos diferentes de orígenes de datos.

Comparación del control SqlDataSource

A diferencia del control SqlDataSource, que sólo funciona con tablas de base de datos relacionales, el control LinqDataSource permite conectar con datos almacenados en colecciones en memoria. Con el control SqlDataSource, debe establecer explícitamente las propiedades SelectCommand, UpdateCommand, InsertCommand y DeleteCommand en consultas SQL. Sin embargo, con el control LinqDataSource no tiene que establecer explícitamente estos comandos, porque el control LinqDataSource utiliza LINQ a SQL para crearlos automáticamente. Si desea modificar las columnas seleccionadas de un origen de datos, no tiene que escribir un comando SQL Select completo. Sólo tiene que proporcionar los nombres de las columnas que desea devolver en la consulta en la propiedad Select.

Al actualizar o insertar datos, no tiene que crear parámetros para cada valor que se va a guardar en la base de datos. El control LinqDataSource puede crear comandos de actualización que incluyan los valores correspondientes haciendo corresponder la propiedad DataField con los nombres de propiedad de la clase de entidad.

Comparación del control ObjectDataSource

Con el control ObjectDataSource, debe crear manualmente el objeto que representa los datos y, a continuación, escribir los métodos para interactuar con ellos. Después, debe hacer corresponder las propiedades SelectMethod, UpdateMethod, InsertMethod y DeleteMethod a los métodos que realizan esas funciones. En el control LinqDataSource, utiliza Diseñador relacional de objetos para crear automáticamente las clases que representan los datos. No tiene que escribir código para especificar qué columnas hay en la tabla de base de datos o cómo seleccionar, actualizar, insertar y eliminar datos. Puede utilizar también el control LinqDataSource para interactuar directamente con una recolección de datos como una matriz. En ese caso, no es necesario crear una clase que administre la lógica para interactuar con la recolección de datos.

Seleccionar datos

Si no especifica un valor para la propiedad Select del control LinqDataSource, se recuperan todas las propiedades de la clase de origen de datos. Por ejemplo, el control LinqDataSource devuelve un valor para cada columna de una tabla de base de datos.

Puede restringir las propiedades que se recuperan del origen de datos estableciendo la propiedad Select en los nombres de las propiedades que desee. Si sólo desea devolver una propiedad, establezca la propiedad Select en esa propiedad. Por ejemplo, para devolver sólo los valores de la columna City de una tabla de base de datos, establezca la propiedad Select en City. El control LinqDataSource devolverá una recolección List<T> que contiene los elementos correctamente escritos de la propiedad. Si la propiedad City está escrita como texto (cadena), al seleccionar la propiedad City, se devuelve una recolección List<T> de valores de cadena.

Para recuperar únicamente algunas de las propiedades de la clase de datos, se utiliza la función new en la propiedad Select y se especifican las columnas que se van a devolver. La función new es necesaria porque va a crear dinámicamente una clase que sólo contiene las propiedades que ha especificado. Por ejemplo, si desea recuperar las propiedades City y PostalCode de un origen de datos que contiene las direcciones completas, establezca la propiedad Select en new(City, PostalCode). El control LinqDataSource devolverá una recolección List<T> que contiene instancias de una clase que incluye esas propiedades.

No tiene que utilizar la función new al seleccionar sólo una propiedad, porque el objeto que se devuelve es una recolección simple de valores de esa propiedad. Sin embargo, para varias propiedades, el control LinqDataSource debe crear una nueva clase que incluya las propiedades especificadas.

Calcular valores con la cláusula Select

Puede calcular valores en una cláusula Select. Por ejemplo, para calcular el total de artículos de línea de un pedido, establezca la propiedad Select en new(SalesOrderDetailID, OrderQty * UnitPrice As LineItemTotal). La palabra clave As permite asignar un nombre (alias) al valor calculado. Para obtener más información, vea Tutorial: Seleccionar y filtrar un subconjunto de datos con los controles LinqDataSource y GridView.

En el ejemplo siguiente se muestra cómo usar un control LinqDataSource para recuperar un subconjunto de datos. En el ejemplo, la propiedad Select se establece para asignar un alias a los valores devueltos y para calcular un valor.

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

Filtrar datos con la cláusula Where

Puede filtrar los datos devueltos para recuperar únicamente los registros que cumplan determinados criterios. Para ello, tendrá que establecer la propiedad Where en las condiciones que se deben cumplir para que un registro se incluya en los datos devueltos. Si no especifica un valor para la propiedad Where, se recuperan todos los registros del origen de datos. El filtro se crea mediante una expresión de filtro, que utiliza una comparación para determinar si debe incluirse un registro. La comparación puede realizarse con un valor estático o un valor variable que se especifica con un marcador de posición de parámetro.

Crear una cláusula Where con valores estáticos

Cuando se compara el valor de una propiedad con un valor estático, la propiedad Where se define utilizando la propiedad y el valor estático. Por ejemplo, para devolver sólo los registros con un valor ListPrice mayor que 1.000, establezca la propiedad Where en ListPrice > 1000.

Puede utilizar los operadores && y and para una comparación AND lógica y los operadores || u or para una comparación OR lógica. Por ejemplo, establezca la propiedad Where en ListPrice > 1000 || UnitCost > 500 || DaysToManufacture > 3 para devolver los registros con un valor ListPrice mayor que 1.000, con un valor UnitCost mayor que 500 o con un valor DaysToManufacture mayor que 3. Para especificar que todas las condiciones se deben cumplir para devolver un registro, establecería la propiedad Where en ListPrice > 1000 && UnitCost > 500 && DaysToManufacture > 3.

Al comparar valores de cadena, debe incluir las condiciones entre comillas simples y el valor literal entre comillas dobles. Por ejemplo, establezca la propiedad Where en 'Category = "Sports"' para recuperar sólo los registros cuya columna Category sea igual a "Sports".

En el ejemplo siguiente se muestra un control LinqDataSource que recupera datos filtrados por un valor de cadena y un valor numérico.

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

Crear un cláusula Where parametrizada

Si desea comparar un valor de propiedad con un valor que sólo se conoce en tiempo de ejecución, defina un parámetro en la recolección de propiedades WhereParameters. Por ejemplo, si desea filtrar utilizando un valor proporcionado por el usuario, cree un parámetro que represente el valor. El control LinqDataSource crea la cláusula Where con el valor actual del parámetro.

En el ejemplo siguiente se muestra un control LinqDataSource que recupera los datos basados en la selección del usuario en un control denominado DropDownList1.

<asp:DropDownList AutoPostBack="true" ID="DropDownList1" >
  <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" 
    >
  <WhereParameters>
    <asp:ControlParameter 
      Name="Category" 
      ControlID="DropDownList1" 
      Type="String" />
  </WhereParameters>
</asp:LinqDataSource>
<asp:GridView 
    DataSourceID="LinqDataSource1"
    ID="GridView1" 
    >
</asp:GridView>

El control LinqDataSource crea automáticamente la cláusula Where al establecer la propiedad AutoGenerateWhereClause en true. Esta opción es útil cuando hay varios parámetros porque no tiene que especificar cada condición en la propiedad Where. En lugar de ello, agrega los parámetros en la recolección de propiedades WhereParameters y el control LinqDataSource crea una cláusula Where que incluye cada parámetro.

Al establecer la propiedad AutoGenerateWhereClause en true, el nombre de los parámetros debe coincidir con el nombre de las propiedades correspondientes. Por ejemplo, para comparar el valor de un parámetro con la propiedad Category, el parámetro se debe denominar Category. Todas las comparaciones son de igualdad; no puede comprobar si un valor es mayor o menor que el valor del parámetro. Cuando se especifican varios parámetros en la recolección WhereParameters, los parámetros se vinculan con un AND lógico.

Si tiene que comprobar la desigualdad o las condiciones de vínculo con un OR lógico, establezca la propiedad AutoGenerateWhereClause en false. A continuación, puede definir las condiciones en la propiedad Where. Debe incluir un marcador de posición en la propiedad Where para cada parámetro.

En el ejemplo siguiente se muestra cómo comprobar la desigualdad al filtrar los datos.

<asp:DropDownList 
    AutoPostBack="true" 
    ID="DropDownList1" 
    >
  <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" 
    >
  <WhereParameters>
    <asp:ControlParameter 
      Name="UserPrice" 
      DefaultValue="0" 
      ControlID="DropDownList1" 
      Type="Int32" />
  </WhereParameters>
</asp:LinqDataSource>
<asp:GridView 
    DataSourceID="LinqDataSource1"
    ID="GridView1" 
    >
</asp:GridView>

Para obtener más información, vea AutoGenerateWhereClause.

Agrupar y agregar datos

Puede agrupar datos para consolidar los datos de registros que tienen valores comunes en una o varias columnas. Para ello, establezca la propiedad GroupBy en el nombre de las propiedades que desea utilizar para consolidar los datos. Por ejemplo, para agrupar los registros con el mismo valor de ciudad de una tabla que contiene información de dirección, establezca GroupBy en City.

Puede calcular los valores en los datos agrupados, como la media o suma de una propiedad, utilizando las funciones de agregado en combinación con la propiedad GroupBy. Los valores que se utilizan para la agrupación se recuperan haciendo referencia al objeto Key.

En el ejemplo siguiente se muestra cómo agrupar los datos en una propiedad denominada ProductCategory. Los valores agrupados se recuperan incluyendo Key en la propiedad Select. Los métodos de agregación Average y Count se incluyen también en la propiedad 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" 
  >
</asp:LinqDataSource>

Puede recuperar los registros individuales que pertenecen a un grupo mediante la palabra clave It. Para obtener más información, vea Cómo: Agrupar y agregar datos utilizando el control LinqDataSource.

Métodos de agregación

En la tabla siguiente se muestran los métodos de agregación disponibles cuando se utiliza el control LinqDataSource.

Función de agregado

Descripción

Count()

Devuelve el número total de registros de un conjunto de datos.

Average(columna)

Devuelve el valor medio de la columna especificada para todos los registros devueltos.

Sum(columna)

Devuelve el valor de sumar todos los valores en la columna especificada para todos los registros devueltos.

Max(columna)

Devuelve el valor máximo de la columna especificada para todos los registros devueltos.

Min(columna)

Devuelve el valor mínimo de la columna especificada para todos los registros devueltos.

Where(condición)

Filtra los registros devueltos en función de la condición especificada.

Any()

Determina si la recolección contiene algún registro.

All(condición)

Determina si todos los registros de la recolección satisfacen la condición especificada.

Actualizar, insertar y eliminar datos

Puede configurar el control LinqDataSource para crear automáticamente los comandos para actualizar, insertar y eliminar datos. Para habilitar las actualizaciones automáticas de datos, establezca la propiedad EnableUpdate, EnableInsert o EnableDelete en true.

Nota:

Si desea que el control LinqDataSource genere automáticamente comandos de actualización, no puede establecer la propiedad Select. Cuando se establece la propiedad Select, el control LinqDataSource devuelve un objeto que es una instancia de una clase dinámica. No es una instancia de la clase que representa la tabla de base de datos. Por consiguiente, la clase dinámica no puede deducir cómo se actualizan los valores de la tabla de base de datos.

Si desea establecer mediante programación los valores que se van a actualizar, puede crear controladores de eventos para los eventos Updating, Inserting o Deleting. En el controlador, puede establecer un valor antes de que se inicie la operación de datos. Para obtener más información, vea Cómo: Actualizar, insertar y eliminar datos con el control LinqDataSource.

Ordenar datos

El objeto LinqDataSource permite ordenar los datos de una consulta de dos formas diferentes. Puede ordenar los datos por valores estáticos al desarrollar la página Web. Puede permitir también que los usuarios ordenen dinámicamente los datos en tiempo de ejecución.

Para ordenar los datos según valores estáticos, asigne el nombre de una propiedad a la propiedad OrderBy. Para permitir que los usuarios ordenen los datos en tiempo de ejecución, establezca la propiedad AutoSort en true (que es el valor predeterminado). A continuación, pase una expresión de ordenación al control LinqDataSource. Un control enlazado a datos como el control GridView pasará una expresión de ordenación cuando su propiedad AllowSorting esté establecida en true.

Para especificar varios nombres de columna en la propiedad OrderBy, separe los nombres con una coma. Por ejemplo, si especifica "LastName, FirstName", los registros se ordenarán primero por LastName y los registros que contengan valores coincidentes en el campo LastName se ordenarán por FirstName.

Puede utilizar ambas formas de ordenar los datos si desea que primero se devuelvan los datos en un orden determinado y, después, permitir que los usuarios cambien ese orden. En ese caso, establezca la propiedad AutoSort en true y la propiedad OrderBy en el nombre de una propiedad.

En el ejemplo siguiente se muestra un control LinqDataSource que primero ordena los registros por LastName, luego por FirstName y después por MiddleName. El control LinqDataSource también se configura para permitir a los usuarios ordenar dinámicamente las filas. Puede enlazar un control de datos como el control GridView al control LinqDataSource para mostrar los datos y permitir que los usuarios especifiquen un criterio de ordenación.

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

Utilizar parámetros para evaluar dinámicamente valores

Cuando utilice el control LinqDataSource, usará parámetros para especificar valores que se deben interpretar o convertir en tiempo de ejecución. A diferencia de lo que ocurre con otros controles de origen de datos, no tiene que especificar cada uno de los valores que forman parte de la operación de actualización, inserción o eliminación. El control LinqDataSource establece automáticamente esos valores y utiliza LINQ a SQL para generar los comandos SQL. Los parámetros sólo se especifican para proporcionar valores predeterminados o para convertir valores vacíos. Puede utilizar también las colecciones de parámetros WhereParameters y OrderByParameters para ordenar o filtrar datos en función de valores en tiempo de ejecución. Para obtener más información sobre LINQ a SQL, vea LINQ to SQL.

El control LinqDataSource contiene las colecciones de parámetros siguientes:

Para obtener un ejemplo de cómo utilizar la colección WhereParameters para permitir que los usuarios filtren dinámicamente los registros devueltos por un control LinqDataSource, vea Filtrar datos con la cláusula Where previamente en este tema.

Control de concurrencia

Al permitir que los usuarios actualicen o eliminen datos, puede ser conveniente asegurarse de que otro proceso no haya cambiado los datos del origen de datos antes de continuar con la actualización o supresión. Si no comprueba si los valores han cambiado, puede sobrescribir involuntariamente valores establecidos por otro proceso y generar datos incoherentes.

El control LinqDataSource permite determinar si los datos han cambiado. El control almacena los valores de datos originales en el estado de vista de la página web. Cuando se devuelve la página web, la página contiene los valores originales y todos los valores actualizados. El control LinqDataSource utiliza LINQ a SQL para comparar los valores originales con los valores que se encuentran actualmente en el origen de datos. Si los valores son los mismos, los datos no han cambiado y LINQ a SQL los actualiza o los elimina. Si los datos han cambiado, LINQ a SQL produce una excepción.

Puede especificar manualmente qué valores de columna se comprueban estableciendo la propiedad UpdateCheck de una columna de la clase de entidad. Cuando Diseñador relacional de objetos genera código para una tabla de base de datos, establece la propiedad UpdateCheck en Never para las columnas administradas por la base de datos. El valor de cualquier otra columna está establecido en Always, lo que significa que siempre se incluye en una comprobación de simultaneidad. Establezca la propiedad UpdateCheck en Never para evitar que esa columna se incluya en la comprobación de simultaneidad. Al establecer la propiedad en Never, se impide también que los valores se almacenen en el estado de vista. Establezca la propiedad UpdateCheck en WhenChanged para comparar el valor con el origen de datos sólo cuando el usuario ha cambiado el valor.

Si debe almacenar datos confidenciales en el estado de vista, debe cifrar éste. Para obtener más información, vea Encrypt ViewState in ASP.NET 2.0.

Nota:

El cifrado del estado de vista puede afectar al rendimiento de las páginas web.

Optimizar las comprobaciones de simultaneidad para datos de SQL Server

Al almacenar muchos valores en el estado de vista, puede aumentar el tamaño de una página web y se podrían divulgar datos confidenciales a los usuarios. Si trabaja con datos de una base de datos de SQL Server, puede mejorar el rendimiento y la seguridad de una página web creando una columna en la base de datos que contenga un valor de marca de tiempo. SQL Server actualiza automáticamente la columna de marca de tiempo cada vez que se modifica el registro. En ese caso, el control LinqDataSource no tiene que comparar cada columna de un registro para determinar si el registro ha cambiado. En lugar de ello, puede comparar sólo la marca de tiempo del estado de vista con la marca de tiempo de la base de datos.

Si agrega una columna de marca de tiempo en una base de datos de SQL Server, Diseñador relacional de objetos crea automáticamente la clase de entidad para que sólo la marca de tiempo se almacene en el estado de vista. Para obtener más información, vea Tutorial: Usar una marca de tiempo con el control LinqDataSource para comprobar la integridad de los datos.

Utilizar procedimientos almacenados

Para utilizar el control LinqDataSource para recuperar los datos de un procedimiento almacenado, debe crear un controlador para el evento Selecting. En el controlador de eventos, llama al método de la clase del contexto de los datos que representa el procedimiento almacenado. A continuación, establece el resultado del procedimiento almacenado en la propiedad Result del objeto LinqDataSourceSelectEventArgs. Si desea habilitar las operaciones de actualización, inserción y eliminación automáticas, el tipo de datos que se devuelve del método debe coincidir con el tipo especificado en la propiedad TableName.

En el ejemplo siguiente se muestra cómo asignar la propiedad Result al objeto que se devuelve de un método que representa un procedimiento almacenado.

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();
}

Para obtener más información acerca de cómo crear métodos de contexto de datos, vea Cómo: Crear métodos DataContext asignados funciones y procedimientos almacenados (Diseñador relacional de objetos).

Validar valores al modificar datos

Antes de modificar un registro de datos, podría tener que validar los valores. Normalmente, las comprobaciones de validación se incluyen en la clase de datos y no en la página web. Si centraliza las comprobaciones de validación en la clase de datos, se asegura de que se pueden utilizar sin tener en cuenta cómo se utiliza la clase de datos. Para obtener más información sobre cómo agregar validación a una clase, vea Cómo: Agregar validación a clases de entidad y Tutorial: Agregar validación a clases de entidad.

Las excepciones de validación se inician antes de actualizar, insertar o eliminar datos. Para recuperar excepciones de validación, puede crear controladores para los eventos Inserting, Updating y Deleting. Para obtener más información, vea las clases LinqDataSourceUpdateEventArgs, LinqDataSourceInsertEventArgs y LinqDataSourceDeleteEventArgs.

Eventos del control LinqDataSource

El control LinqDataSource provoca eventos en puntos concretos durante su procesamiento para permitir personalizar el modo en que se seleccionan, insertan, actualizan o eliminan los datos.

Cuando selecciona datos, el control LinqDataSource provoca los siguientes eventos (en el orden indicado):

  1. Selecting

  2. ContextCreating (si es necesario)

  3. ContextCreated (si es necesario)

  4. Selected

  5. ContextDisposing

Si crea el objeto de contexto mediante programación en el evento Selecting y no tiene que almacenar los valores originales en el estado de vista, los eventos ContextCreating y ContextCreated se omiten.

Cuando actualiza, inserta o elimina datos, el control LinqDataSource provoca los siguientes eventos (en el orden indicado):

  1. ContextCreating

  2. ContextCreated

  3. Inserting, Updating o Deleting

  4. Inserted, Updated o Deleted

  5. ContextDisposing

El orden de los eventos para las operaciones de actualización, eliminación e inserción difiere del de las operaciones de selección. Esto se debe a que el control LinqDataSource debe obtener una instancia del objeto de datos y pasar esa instancia a los eventos Inserting, Updating o Deleting.

Los eventos Selecting, Inserting, Updating y Deleting se provocan antes de que se ejecute la operación de datos. Para validar y modificar valores antes de la operación, o para cancelar la operación, se crean controladores de eventos para esos eventos. Por ejemplo, si la base de datos contiene una columna que almacena el usuario que modificó por última vez un registro, puede utilizar el evento Updating para establecer mediante programación el valor del nombre de usuario.

Los eventos Selected, Inserted, Updated y Deleted se provocan una vez finalizada la operación. Para detectar excepciones o para examinar valores devueltos por la operación, se crean controladores de eventos para esos eventos.

El evento ContextCreating se provoca antes de que el control LinqDataSource cree el tipo especificado en la propiedad ContextTypeName. Controle este evento si desea crear mediante programación el tipo de contexto. Esto podría ser conveniente, por ejemplo, si el método constructor del tipo de contexto requiere parámetros. El evento ContextCreated se provoca una vez creado el tipo especificado en la propiedad ContextTypeName. Controle este evento para detectar excepciones o examinar el objeto de contexto creado. El evento ContextDisposing se provoca antes de que el control LinqDataSource elimine el tipo de contexto especificado en la propiedad ContextTypeName. Controle este evento para cancelar la eliminación de un objeto que cueste mucho crear (en tiempo o en recursos). Puede utilizar también el evento para realizar una limpieza específica para el objeto antes de que éste se destruya.

Volver al principio

Ejemplos de código

Tutorial: Recuperar, actualizar, insertar y eliminar datos con los controles LinqDataSource y DetailsView

Tutorial: Seleccionar y filtrar un subconjunto de datos con los controles LinqDataSource y GridView

Tutorial: Usar una marca de tiempo con el control LinqDataSource para comprobar la integridad de los datos

Cómo: Agrupar y agregar datos utilizando el control LinqDataSource

Cómo: Actualizar, insertar y eliminar datos con el control LinqDataSource

Volver al principio

Referencia de clases

En la tabla siguiente se indican las clases clave relacionadas con la clase LinqDataSource.

Miembro

Descripción

LinqDataSource

Aplica expresiones LINQ a un origen de datos y representa los datos en controles enlazados a datos.

LinqDataSourceView

Admite el control LinqDataSource y proporciona una interfaz para controles enlazados a datos para realizar operaciones de datos con objetos de datos. Esta clase está diseñada principalmente para su uso en controles enlazados a datos y no como un objeto programable en código de página.

LinqDataSourceDisposeEventArgs

Proporciona datos para el evento ContextDisposing.

LinqDataSourceContextEventArgs

Proporciona datos para el evento ContextCreating.

LinqDataSourceDeleteEventArgs

Proporciona datos para el evento Deleting.

LinqDataSourceInsertEventArgs

Proporciona datos para el evento Inserting.

LinqDataSourceSelectEventArgs

Proporciona datos para el evento Selecting.

LinqDataSourceStatusEventArgs

Proporciona datos para los eventos ContextCreated, Deleted, Inserted, Selected y Updated.

LinqDataSourceUpdateEventArgs

Proporciona datos para el evento Updating.

Volver al principio

Vea también

Otros recursos

Language-Integrated Query (LINQ)

LINQ to SQL

Diseñador relacional de objetos (Diseñador R/O)