Anunciada la especificación del Content Management Interop Services (CMIS)!

El equipo de SharePoint Enterprise Conten Management (ECM) acaba de anunciar el lanzamiento de la especificación del Content Management Interop Services (CMIS). Se trata de un esfuerzo de estandarización para sistemas ECM lanzado por Microsoft y el resto de grandes jugadores del mercado como IBM, EMC, Alfresco, OpenText, SAP y Oracle. El objetivo de CMIS es definir una serie de servicios web estándar que permitan la interoperabilidad de sistemas ECM como MOSS, EMC Documentun, IBM FileNet y otros.

Podéis encontrar más información respecto a este anuncio en los siguientes enlaces:

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.