read framework ejemplo dotnetperls c# .net performance list collections

framework - read ienumerable c#



Diferencia entre la interfaz IQueryable, ICollection, IList e IDictionary (3)

IQueryable, IList, IDictionary, ICollection hereda la interfaz IEnumerable. Todas las interfaces de la colección de tipos heredarán la interfaz IEnumerable.

Diferencias entre IEnumerable e IQueryable IEnumerable : cuando está ejecutando una consulta que devuelve de tipo IEnumerable. IEnumerable primero Ejecuta la primera consulta y luego ejecuta las subconsultas escritas para esa consulta.

Ejemplo : -Si desea obtener los 10 registros de población principales de un país en particular, la consulta que utilizaremos en LinQ es

IEnumerable _Population = from s en India seleccione s.population; // First Query _Population = _Population.take (10); // Second Query

Ahora, si ejecutamos esta consulta, First Query se ejecutará primero; el IEnumerable obtendrá los registros de toda la población del servidor sql, luego almacenará los datos en la memoria de proceso y luego ejecutará la población de los 10 principales en la siguiente consulta. (La ejecución se lleva a cabo dos veces en el servidor sql).

si ejecutamos la misma consulta usando IQueryable.

IQueryable _Population = from s en India seleccione s.population; // First Query _Population = _Population.take (10); // Second Query

en este IQueryable ejecutará las dos consultas al mismo tiempo en el sentido de que obtendrá la población que está entre las 10 principales en una sola consulta en lugar de obtener los datos y filtrar los primeros 10 nuevamente (ejecución única en el servidor SQL) .

Conclusión para IQueryable e IEnumerable

  1. Si está escribiendo la consulta contra los datos en la base de datos, use IQueryable.
  2. Si consulta sobre los datos en proceso, utilice IEnumerable. IEnumerable tiene los métodos GetEnumerator (), Current () y MoveNext ().

Estoy tratando de entender la diferencia entre la interfaz IQueryable, ICollection, IList y IDictionary, que es más rápida para operaciones básicas como iterar, indexar, consultar y más.

qué clase, como Colección, Lista, Diccionario, etc. sería bueno iniciar con estas interfaces y cuándo deberíamos usar estas clases. Ventajas básicas de usar estas clases sobre otras.

Intenté leer otras publicaciones con preguntas similares, pero nada respondió a todas mis preguntas. Gracias por la ayuda.


Noté varios problemas en la respuesta de @ gunny229, que es la razón por la que escribo esta publicación. También mencioné esos problemas en el área de comentarios de su publicación. Para corregir esa publicación, tendría que volver a escribir casi toda la publicación, así que pensé en crear la mía. No pretendo responder a la pregunta de OP en su totalidad, pero quiero señalar la diferencia entre IQueryable e IEnumerable cuando utilizo LINQ to SQL .

Creé la siguiente estructura en DB (script DDL):

CREATE TABLE [dbo].[Employee]([PersonId] [int] NOT NULL PRIMARY KEY,[Salary] [int] NOT NULL)

Aquí está el script de inserción de registro (script DML):

INSERT INTO [EfTest].[dbo].[Employee] ([PersonId],[Salary])VALUES(1, 20) INSERT INTO [EfTest].[dbo].[Employee] ([PersonId],[Salary])VALUES(2, 30) INSERT INTO [EfTest].[dbo].[Employee] ([PersonId],[Salary])VALUES(3, 40) INSERT INTO [EfTest].[dbo].[Employee] ([PersonId],[Salary])VALUES(4, 50) INSERT INTO [EfTest].[dbo].[Employee] ([PersonId],[Salary])VALUES(5, 60) GO

Ahora mi objetivo era simplemente obtener los 2 registros principales de la tabla Employee en la base de datos. Entonces, agregué un ítem del Modelo de Datos de Entidades ADO.NET en mi aplicación de consola apuntando a la tabla de Employee en mi base de datos y comencé a escribir consultas LINQ.

Código para la ruta IQueryable :

using (var efContext = new EfTestEntities()) { IQueryable<int> employees = from e in efContext.Employees select e.Salary; employees = employees.Take(2); foreach (var item in employees) { Console.WriteLine(item); } }

Cuando comencé a ejecutar este programa, también había comenzado una sesión de SQL Query Profiler en mi instancia de SQL Server y aquí está el resumen de la ejecución:

  1. Número total de consultas disparadas: 1
  2. Texto de consulta: SELECT TOP (2) [c].[Salary] AS [Salary] FROM [dbo].[Employee] AS [c]

Es solo que IQueryable es lo suficientemente inteligente como para aplicar la cláusula Top (2) en el lado del servidor de la base de datos, por lo que solo trae 2 de 5 registros a través del cable. Cualquier otro filtrado en la memoria no es necesario en absoluto en el lado de la computadora del cliente.

Código para la ruta IEnumerable :

using (var efContext = new EfTestEntities()) { IEnumerable<int> employees = from e in efContext.Employees select e.Salary; employees = employees.Take(2); foreach (var item in employees) { Console.WriteLine(item); } }

Resumen de ejecución en este caso:

  1. Número total de consultas disparadas: 1
  2. Texto de consulta capturado en SQL profiler: SELECT [Extent1].[Salary] AS [Salary] FROM [dbo].[Employee] AS [Extent1]

Ahora el asunto es que IEnumerable trajo los 5 registros presentes en la tabla de Salary y luego realizó un filtro en la memoria en la computadora del cliente para obtener los 2 registros principales. Así que más datos (3 registros adicionales en este caso) se transfirieron innecesariamente a través del cable.


Todas estas interfaces heredan de IEnumerable , que debe asegurarse de comprender. Esa interfaz básicamente le permite usar la clase en una declaración foreach (en C #).

  • ICollection es la más básica de las interfaces que enumeró. Es una interfaz enumerable que admite un conteo y eso es todo.
  • IList es todo lo que ICollection es, pero también admite agregar y eliminar elementos, recuperar elementos por índice, etc. Es la interfaz más utilizada para "listas de objetos", que es vaga, lo sé.
  • IQueryable es una interfaz enumerable que admite LINQ. Siempre puede crear un IQueryable desde un IList y usar LINQ en Objects, pero también encuentra que IQueryable se usa para la ejecución diferida de sentencias SQL en LINQ to SQL y LINQ to Entities.
  • IDictionary es un animal diferente en el sentido de que es un mapeo de claves únicas para los valores. También es enumerable en que puede enumerar los pares clave / valor, pero de lo contrario sirve para un propósito diferente al de los otros que enumeró.

La documentación de MSDN para cada uno de estos es decente, por lo que comenzaría allí para completar su comprensión.