Entity Framework: consultas de proyección

LINQ para entidades

Uno de los conceptos más importantes para comprender LINQ to Entities es que es un lenguaje declarativo. La atención se centra en definir qué información necesita, más que en cómo obtenerla.

  • Significa que puede dedicar más tiempo a trabajar con datos y menos a tratar de averiguar el código subyacente necesario para realizar tareas como acceder a la base de datos.

  • Es importante comprender que los lenguajes declarativos en realidad no eliminan ningún control del desarrollador, pero ayudan al desarrollador a centrar la atención en lo que es importante.

Palabras clave esenciales de LINQ to Entities

Es importante conocer las palabras clave básicas que se utilizan para crear una consulta LINQ. Hay solo unas pocas palabras clave para recordar, pero puede combinarlas de varias formas para obtener resultados específicos. La siguiente lista contiene estas palabras clave básicas y proporciona una descripción simple de cada una.

No Señor. Palabra clave y descripción
1

Ascending

Especifica que una operación de ordenación se lleva a cabo desde el elemento más pequeño (o más bajo) de un rango hasta el elemento más alto de un rango. Esta es normalmente la configuración predeterminada. Por ejemplo, al realizar una ordenación alfabética, la ordenación estaría en el rango de la A a la Z.

2

By

Especifica el campo o expresión que se usa para implementar una agrupación. El campo o expresión define una clave utilizada para realizar la tarea de agrupación.

3

Descending

Especifica que una operación de clasificación tiene lugar desde el elemento más grande (o más alto) de un rango hasta el elemento más bajo de un rango. Por ejemplo, al realizar una ordenación alfabética, la ordenación estaría en el rango de Z a A.

4

Equals

Se utiliza entre las cláusulas izquierda y derecha de una declaración de combinación para unir la fuente de datos contextual primaria a la fuente de datos contextual secundaria. El campo o expresión a la izquierda de la palabra clave equals especifica la fuente de datos primaria, mientras que el campo o expresión a la derecha de la palabra clave equals especifica la fuente de datos secundaria.

5

From

Especifica la fuente de datos utilizada para obtener la información requerida y define una variable de rango. Esta variable tiene el mismo propósito que una variable utilizada para la iteración en un bucle.

6

Group

Organiza la salida en grupos utilizando el valor clave que especifique. Use múltiples cláusulas de grupo para crear múltiples niveles de organización de resultados. El orden de las cláusulas de grupo determina la profundidad a la que aparece un valor de clave particular en el orden de agrupación. Combina esta palabra clave con by para crear un contexto específico.

7

In

Se utiliza de varias formas. En este caso, la palabra clave determina la fuente de la base de datos contextual utilizada para una consulta. Cuando se trabaja con una combinación, la palabra clave in se utiliza para cada fuente de base de datos contextual utilizada para la combinación.

8

Into

Especifica un identificador que puede usar como referencia para las cláusulas de consulta LINQ, como unirse, agrupar y seleccionar.

9

Join

Crea una única fuente de datos a partir de dos fuentes de datos relacionadas, como en una configuración maestra / detallada. Una combinación puede especificar una combinación interna, de grupo o izquierda-externa, con la combinación interna como predeterminada. Puede leer más sobre las uniones en msdn.microsoft.com

10

Let

Define una variable de rango que puede utilizar para almacenar los resultados de subexpresión en una expresión de consulta. Por lo general, la variable de rango se usa para proporcionar una salida enumerada adicional o para aumentar la eficiencia de una consulta (de modo que una tarea en particular, como encontrar el valor en minúsculas de una cadena, no necesita realizarse más de una vez).

11

On

Especifica el campo o la expresión que se utiliza para implementar una combinación. El campo o expresión define un elemento que es común a ambas fuentes de datos contextuales.

12

Orderby

Crea un orden de clasificación para la consulta. Puede agregar la palabra clave ascendente o descendente para controlar el orden de clasificación. Utilice varias cláusulas orderby para crear varios niveles de clasificación. El orden de las cláusulas orderby determina el orden en el que se manejan las expresiones de ordenación, por lo que usar un orden diferente dará como resultado una salida diferente.

13

Where

Define lo que LINQ debe recuperar del origen de datos. Utiliza una o más expresiones booleanas para definir los detalles de qué recuperar. Las expresiones booleanas se separan entre sí mediante && (AND) y || (OR) operadores.

14

Select

Determina el resultado de la consulta LINQ especificando qué información devolver. Esta declaración define el tipo de datos de los elementos que LINQ devuelve durante el proceso de iteración.

Proyección

Las consultas de proyección mejoran la eficiencia de su aplicación, recuperando únicamente campos específicos de su base de datos.

  • Una vez que tenga los datos, es posible que desee proyectarlos o filtrarlos según sea necesario para dar forma a los datos antes de la salida.

  • La tarea principal de cualquier expresión de LINQ to Entities es obtener datos y proporcionarlos como salida.

La sección “Desarrollo de consultas de LINQ to Entities” de este capítulo muestra las técnicas para realizar esta tarea básica.

Echemos un vistazo al siguiente código en el que se recuperará la lista de estudiantes.

using (var context = new UniContextEntities()) {

   var studentList = from s in context.Students select s;

   foreach (var student in studentList) {
      string name = student.FirstMidName + " " + student.LastName;
      Console.WriteLine("ID : {0}, Name: {1}", student.ID, name);
   }
}

Objeto único

Para recuperar un solo objeto de estudiante, puede usar los métodos enumerables First () o FirstOrDefault que devuelve el primer elemento de una secuencia. La diferencia entre First y FirstOrDefault es que First () generará una excepción, si no hay datos de resultado para los criterios proporcionados, mientras que FirstOrDefault () devuelve el valor predeterminado nulo, si no hay datos de resultado. En el siguiente fragmento de código, se recuperará el primer alumno de la lista cuyo nombre es Ali.

using (var context = new UniContextEntities()) {

   var student = (from s in context.Students where s.FirstMidName 
      == "Ali" select s).FirstOrDefault<Student>();

   string name = student.FirstMidName + " " + student.LastName;
   Console.WriteLine("ID : {0}, Name: {1}", student.ID, name);
}

También puede usar Single () o SingleOrDefault para obtener un solo objeto de estudiante que devuelve un solo elemento específico de una secuencia. En el siguiente ejemplo, se recupera un solo estudiante cuyo ID es 2.

using (var context = new UniContextEntities()) {

   var student = (from s in context.Students where s.ID 
      == 2 select s).SingleOrDefault<Student>();
   string name = student.FirstMidName + " " + student.LastName;
	
   Console.WriteLine("ID : {0}, Name: {1}", student.ID, name);
   Console.ReadKey();
}

Lista de objetos

Si desea recuperar la lista de estudiantes cuyo primer nombre es Ali, puede usar el método enumerable ToList ().

using (var context = new UniContextEntities()) {

   var studentList = (from s in context.Students where s.FirstMidName 
      == "Ali" select s).ToList();

   foreach (var student in studentList) {
      string name = student.FirstMidName + " " + student.LastName;
      Console.WriteLine("ID : {0}, Name: {1}", student.ID, name);
   }

   Console.ReadKey();
}

Orden

Para recuperar datos / listas en cualquier orden en particular, puede usar orderby palabra clave. En el siguiente código, la lista de fragmentos de estudiantes se recuperará en orden ascendente.

using (var context = new UniContextEntities()) {

   var studentList = (from s in context.Students orderby
      s.FirstMidName ascending select s).ToList();

   foreach (var student in studentList) {
      string name = student.FirstMidName + " " + student.LastName;
      Console.WriteLine("ID : {0}, Name: {1}", student.ID, name);
   }

   Console.ReadKey();
}

Consulta de marco de entidad de proyección estándar Vs

Supongamos que tiene un modelo de estudiante que contiene el ID, FirstMidName, LastName y EnrollmentDate. Si desea devolver una lista de Estudiantes, una consulta estándar devolvería todos los campos. Pero si solo desea obtener una lista de estudiantes que contengan los campos ID, FirstMidName y LastName. Aquí es donde debe utilizar una consulta de proyección. A continuación se muestra un ejemplo simple de consulta de proyección.

using (var context = new UniContextEntities()) {

   var studentList = from s in context.Students
      orderby s.FirstMidName ascending
      where s.FirstMidName == "Ali"

   select new {s.ID, s.FirstMidName, s.LastName};

   foreach (var student in studentList) {
      string name = student.FirstMidName + " " + student.LastName;
      Console.WriteLine("ID : {0}, Name: {1}", student.ID, name);
   }

   Console.ReadKey();
}

La consulta de proyección anterior excluye el campo EnrollmentDate. Esto hará que su solicitud sea mucho más rápida.