Blog del CIIN

Blog del Centro de Innovación en Integración de Cantabria

This Blog

Syndication

Search

Tags

Community

Email Notifications

Archives

Enlaces Recomendados

ADO.NET Entity Framework: Algunos detalles (II)!

Siguiendo con las pruebas de ADO.NET Entity Framework (ADO.NET EF) comenzadas en este post, en esta nueva entrega vamos a hablar de uno de los elementos de EF: Entity Client. Se trata de un nuevo proveedor de datos que aparece con EF y que permite realizar consultas a entidades de un modelo conceptual. Para ello emplea el lenguaje Entity SQL (eSQL) que permite realizar consultas al modelo independientemente de la tecnología de base de datos subyacente. Empecemos.

Entity Client

Lo primero que tenemos que hacer es añadir una referencia al  espacio de nombres EntityClient.

 image

Añadimos las correspondientes sentencias using relativas a los espacios System.Entity y System.Data:

using System.Data;

using System.Data.EntityClient;

A continuación vamos a definir una consulta al EDM mediante Entity Client:

            var ecConexion =

                new EntityConnection();

 

            ecConexion.ConnectionString = "Name=AdventureWorksLTContext";

            var ecComando = ecConexion.CreateCommand();

            ecComando.CommandText

                = "SELECT VALUE p from AdventureWorksLTContext.Product AS p";

            ecConexion.Open();

 

            var ecReader =

                ecComando.ExecuteReader(CommandBehavior.SequentialAccess);

 

            Console.WriteLine("******Query******");

            Console.WriteLine(ecComando.ToTraceString());

            Console.ReadLine();

            Console.WriteLine("******Resultados******");

 

            while (ecReader.Read())

            {

                Console.WriteLine("Producto: {0}", ecReader["Name"]);

            }

 

            ecConexion.Close();

            Console.ReadLine();

Como vemos, lo que estamos haciendo en el código anterior es:

  • Definir una instancia de EntityConnection que representa la conexión al EDM. Esta conexión está plenamente identificada por el nombre del EntityContainer (AdventureWorksLTContext), si bien podríamos especificar la cadena de conexión completa (referenciar a las tres capas que constituyen el EDM). Sin embargo, no necesitamos especificar la cadena de conexión completa dado que el EDM está en el mismo ensamblado que el consumidor.
  • Definimos una instancia del objeto EntityCommand que representa la consulta que vamos a realizar al modelo. Esta consulta la estamos definiendo en Entity SQL (eSQL). De esta consulta destacaría que usa la palabra clave VALUE, lo que le indica al runtime que no envuelva el resultado de la consulta como una fila e datos.
  • Abrimos la conexión al modelo.
  • Ejecutamos el comando mediante un objeto de tipo EntityDataReader.
  • Mediante reflexión y el método ToTraceString, obtenemos la consulta que se envía a la BD subyacente al modelo.
  • Leemos el resultado de la ejecución del comando mediante el método Read() del objeto EntityReader.
  • Cerramos la conexión al modelo.

Tras ejecutar el código anterior:

  • Por un lado, tenemos la consulta enviada a la BD.
  • Por otro, tenemos el resultado de la consulta.
image image

Al igual que ocurre con T-SQL convencional, eSQL permite definir consultas parametrizadas. Por ejemplo, podemos realizar una consulta sobre la entidad Product aplicando un filtro a la columna Name:

            Console.ReadLine();

            Console.WriteLine("******Consulta parametrizada******");

            ecComando.Dispose();

            ecComando = ecConexion.CreateCommand();

            ecComando.CommandText =

                "SELECT p.Name FROM AdventureWorksLTContext.Product AS p " +

                "WHERE Length(p.Name)>@iLongitud";

            ecComando.Parameters.AddWithValue("iLongitud", 30);

 

            ecReader =

                ecComando.ExecuteReader(CommandBehavior.SequentialAccess);

 

            Console.WriteLine("******Query******");

            Console.WriteLine(ecComando.ToTraceString());

            Console.ReadLine();

            Console.WriteLine("******Resultados******");

 

            while (ecReader.Read())

            {

                Console.WriteLine("Producto: {0}", ecReader["Name"]);

            }

 

            ecConexion.Close();

            Console.ReadLine(); 

Como vemos en el código anterior:

  • En primer lugar liberamos los recursos que usa el objeto EntityCommand.
  • Creamos un nuevo comando que utiliza un parámetro.
  • Le añadimos el parámetro al EntityCommand a través de la definición de un EntityParameter.
  • Ejecutamos la consulta.
  • Mostramos la consulta enviada.
  • Ejecutamos la consulta.

Los resultados obtenidos en este caso son los siguientes:

image image

Como veis, la API EntityClient permite crear rápidamente consultas a un EDM utilizando un estilo similar al tradicional ADO.NET.

Published 11/9/2008 0:57 por Juan Carlos González Martín

Comparte este post:

Comentarios

# re: ADO.NET Entity Framework: Algunos detalles (II)!@ Thursday, September 11, 2008 1:42 AM

Hola Juan Carlos,

el eSQL  me hace recordar al HQL , Hibernate Query Language , lenguage de consultas sobre objetos de NHibernate, imagine que seria LINQ el lenguaje de consultas de EF , cual seria la diferencias , ventajas , o desventajas de usar eSQL contra LINQ?

Te comento que se lanzo Nhibernate 2.0 asi como el portal de Usuarios de NHibernate http://www.nhforge.org/

Muchas Gracias.

Un saludo desde Lima , Peru.

devsoftx

# re: ADO.NET Entity Framework: Algunos detalles (II)!@ Thursday, September 11, 2008 8:17 AM

Buenas devsoftx,

Pues precisamente lo bueno de EF es que te da varias posibilidades de consultar un EDM: LINQ To Entities, eSQL y Object Services...en cuanto a ventajas / inconvenientes de cada alternativa:

- Con eSQL pierdes todas las ventajas que te da LINQ To Entities en cuanto a resultados tipados, intellisense, etc. Piensa que con eSQL estamos haciendo consultas utilizando el estilo tradicional: las pegamos en código.

- Sin embargo, eSQL tiene una ventaja sobre LINQ To Entities: facilita escribir queries dinámicas.

- Si te das cuenta, hasta ahora he hablado de realizar consultas en modo lectura...y es aquí dónde tienes otra desventaja de eSQL: no está preparado para hacer operaciones de borrado, actualización e insercción de datos.

Y estas son de momento las que se me ocurren...este es un buen tema para un post. A ver si alguien se anima ;-).

Un saludo

JC's

Juan Carlos González Martín

# re: ADO.NET Entity Framework: Algunos detalles (II)!@ Thursday, September 11, 2008 1:12 PM

Hola de nuevo!

Aprovechando que tenemos unos HOL's de EF con Unai, os comento más ventajas/desventajas de eSQL frente a LINQ To Entities:

- Con LINQ To Entities y Object Query necesitamos usar menos clases para trabajar con el modelo. Con eSQL al menos tendremos que definir objetos de tipo EntityConnection, EntityCommand y EntityDataReader, es decir, LINQ To Entities nos permite materializar los objetos de forma automática.

- Con eSQL tenemos que materializar los resultados de la consulta. Con LINQ To Entities y ObjectQuery no es necesario.

Un saludo

JC's

p.d: Seguro que añado más cosas conforme avancen los HOL's

Juan Carlos González Martín

# re: ADO.NET Entity Framework: Algunos detalles (II)!@ Saturday, October 18, 2008 10:34 PM

Hola,

Una pregunta ahora que estoy reciclandome y pasando de Delphi a VS2008.

Mediante ADO.NET EF

¿ se podrían crear entidades(clases) nuevas en el EDM en tiempo de ejecución ?

¿ y nuevas propiedades (campos) ?

¿ y nuevas relaciones entre entidades?

Saludos y gracias de antemano.

jordi

# re: ADO.NET Entity Framework: Algunos detalles (II)!@ Monday, October 20, 2008 9:51 AM

Buenas Jordi,

Aunque no he visto ningún ejemplo sobre lo que preguntas, entiendo que si se pueda hacer porque al final el modelo de ADO.NET EF es la unión de tres ficheros XML: el CSDL, MSDL y el SSDL...entiendo que tu te quedes al nivel CSDL (Conceptual) y que puedas añadir nuevas entidades tratando directamente el archivo XML y añadiendo entidades, campos, relaciones, etc.

De todos modos, si averiguo alguna cosa más lo postearé.

Un saludo

JC's

Juan Carlos González Martín

# re: ADO.NET Entity Framework: Algunos detalles (II)!@ Monday, October 20, 2008 10:23 PM

Hola JC,

Muchas gracias por la respuesta.

Intentaré hacer alguna prueba.

Saludos.

Jordi