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.

Publicado por

Juan Carlos González

Juan Carlos es Ingeniero de Telecomunicaciones por la Universidad de Valladolid y Diplomado en Ciencias Empresariales por la Universidad Oberta de Catalunya (UOC). Cuenta con más de 12 años de experiencia en tecnologías y plataformas de Microsoft diversas (SQL Server, Visual Studio, .NET Framework, etc.), aunque su trabajo diario gira en torno a SharePoint & Office 365. Juan Carlos es MVP de Office Servers & Services desde 2015 (anteriormente fue reconocido por Microsoft como MVP de Office 365 y MVP de SharePoint Server desde 2008 hasta 2015), coordinador del grupo de usuarios .NET de Cantabria (Nuberos.Net, www.nuberos.es), co-fundador y coordinador del Grupo de Usuarios de SharePoint de España (SUGES, www.suges.es), así como co-director de la revista gratuita en castellano sobre SharePoint CompartiMOSS (www.compartimoss.com). Hasta la fecha, ha publicado 8 libros sobre SharePoint & Office 365 y varios artículos en castellano y en inglés sobre ambas plataformas.

6 comentarios en “ADO.NET Entity Framework: Algunos detalles (II)!”

  1. 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.

  2. 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

  3. 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

  4. 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.

  5. 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

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *