2008-11-07 16 views
26
  • ¿Cuáles son los pros y los contras de LINQ (Language-Integrated Query)?
  • ¿Cuáles son los mejores y peores casos para usar LINQ?
  • ¿Cómo se benefició o no se benefició el uso de LINQ?
  • ¿Qué fuentes de datos se benefician menos y más de LINQ?
+0

Parece un buen candidato para una pregunta Wiki de la comunidad –

Respuesta

32

Soy un gran admirador de LINQ, aunque debe mantenerse en perspectiva, y no se trata como una bala de plata.

Pros:

  • enfoque declarativo realiza consultas más fácil de entender y más compacto
  • extensibilidad y de expresión árboles permiten consultas en su mayoría consistente de múltiples fuentes
  • Incluso durante el proceso de consultas se pueden implementar de manera distinta que LINQ to Objects - por ejemplo Parallel LINQ y mi propio marco de Push LINQ. Muy flexible.
  • Fabulously útil para consultas en proceso, en las que es más fácil de entender
  • grande para ser capaz de evitar SQL en cadenas etc
  • Amplia gama de operadores proporcionados por defecto, y otros se pueden añadir fácilmente para LINQ Objetos de
  • características
  • lenguaje introducido principalmente para LINQ son ampliamente aplicables en otros lugares (yay para lambdas)

Contras:

  • Las expresiones de consulta no se comprenden lo suficiente y se usan en exceso. A menudo, la invocación de método simple es más corta y más simple.
  • inconsistencias inevitable entre proveedor - falta de concordancia aún está presente, lo que es razonable, pero tiene que ser entendido
  • Siempre habrá algunas cosas que puede hacer en SQL, pero no en LINQ
  • Sin entender lo que está pasando, es fácil de escribir código muy ineficiente
  • Es difícil escribir un proveedor de LINQ. Esto bien puede ser inevitable, pero se apreciaría más orientación de Microsoft.
  • Es una nueva forma de pensar sobre el acceso de datos para la mayoría de los desarrolladores, y necesitará tiempo para la comprensión se filtre
  • No específicamente LINQ, pero relacionado con ella - la forma en métodos de extensión se descubren en C# no es lo suficientemente granular
  • Algunos operadores están "faltantes", particularmente los equivalentes de OrderBy para otras cosas que no sean ordenar, por ejemplo encontrar el elemento con el valor máximo de una propiedad
  • ejecución diferida y streaming son poco conocidos (pero mejorando)
  • depuración puede ser muy difícil debido a la ejecución diferida y el streaming
  • En algunos casos específicos, LINQ puede ser significativamente más lento que el código manual. Cuanto mejor comprenda el funcionamiento interno, mejor podrá predecir esto.(Y, por supuesto, si el rendimiento es importante para usted, debe tener las pruebas adecuadas al respecto.)

Me parece que es mejor cuando se trata de consultas en proceso. Son fáciles de predecir, comprender y extender. Las tecnologías complementarias como LINQ to XML y Parallel LINQ son geniales. LINQ to Objects se puede usar casi en cualquier lugar.

LINQ to SQL, etc. son realmente agradables donde son apropiados, pero son más difíciles de entender y necesitan más experiencia. También son solo aplicables en ciertas áreas de tu código.

+0

dam eso es un montón de inconvenientes, pero aún me encanta –

+12

Deberían cambiar el nombre del sitio Skeetoverflow IMO. – cfeduke

+2

@Nathan: Sí, la lista de contras es desalentadora, pero los profesionales son mucho más importantes :) Extraño LINQ todo el tiempo cuando escribo en Java :( –

3

Mi parte favorita: usarlos para simplificar las pruebas de unidades de escritura. Además, las cadenas de IEnumerable me han instado a escribir interfaces más fluidas en mi código.

Contras: Lambdas y los métodos de extensión son mis martillos y todos los problemas son las uñas.

En general: insufló nueva vida a la programación en C# para mí.

+0

Esas son declaraciones muy elocuentes. De acuerdo 100%. –

1

Existe un problema con ellos de excepciones a escondidas de los bloques de captura de prueba por medio de una ejecución retrasada.

por ejemplo:

var l = new List<int>() {1, 2, 3}; 
try 
{ 
    l.Select(x => x/0); 
} 
catch 
{ 
    // error 
} 

l.elementAt(0); // exception occurs here outside of the try catch 

Cuál puede ser difícil la primera vez que se ejecuta en ella, sobre todo porque el depurador se apuntará en el código dentro del bloque try-catch.

De lo contrario, los encuentro increíblemente útiles y ahorran mucho tiempo.

+1

El ejemplo tal como está escrito funcionará muy bien. Como dijiste, LINQ puede ser astuto pero no en el sentido en que lo impliqué :) La llamada a Select no hará nada; devolverá IEnumerable, que necesita ser iterado para obtener algún resultado. Por lo tanto, no se planteará ninguna excepción, es normal y por diseño, además la colección no se modificará de ninguna manera. Por lo tanto, la última llamada tendrá éxito al devolver 1. – rawpower

1

He usado LINQ principalmente para trabajar en la colección de objetos. LINQ funciona maravillosamente con colecciones de objetos, eliminando la necesidad de funciones de predicado en la mayoría de los casos.

Intenté usar LINQ to SQL hace un tiempo, pero me pareció que tenía poco poder y era torpe. En particular, no pude utilizar el diseñador de clases de SQL Database. Tal vez da intellisense en la base de datos, pero ¿quién lo necesita cuando tienes SQL?

Pero déjenme decirles que definitivamente es una buena idea aprender más sobre LINQ, ya que las aplicaciones en el futuro solo deberían aumentar.

0

Pro:

contra:

  • Como cualquier nueva tecnología demasiadas personas no lo entienden, pero todavía lo utilizan

@ Jon Skeet - otra gran respuesta, robo gustos trueno: P. Estoy totalmente de acuerdo con lo difícil que es escribir un proveedor, ¡estoy en proceso de hacerlo en este momento! ¿Estás familiarizado con Bart De Smet? Él tiene muchos buenos ejemplos de hacerlo.