LINQ: notación de puntos frente a expresión de consulta

Estoy empezando a usar LINQ en general (hasta ahora en XML y toSQL). He visto que a veces hay dos o más formas de lograr los mismos resultados. Tome este simple ejemplo, por lo que yo entiendo, ambos devuelven exactamente lo mismo:

SomeDataContext dc = new SomeDataContext(); var queue = from q in dc.SomeTable where q.SomeDate  q.SomeDate  q.Priority) .ThenBy(q => q.TimeCreated); 

Además de cualquier error que haya cometido en la syntax o en un parámetro o diferencia faltante, la idea es que hay dos formas de express lo mismo; Entiendo que el primer método tiene algunas limitaciones y que la “notación de puntos” es más completa, pero además de eso, ¿hay alguna otra ventaja?

La notación “punto” generalmente se llama syntax Lambda. La primera notación tiene varios nombres, pero generalmente la llamo syntax de consulta.

Trabajo en un equipo de 10 desarrolladores y discutimos extensamente acerca de cuál deberíamos usar como estándar. En general, los desarrolladores más experimentados (con LINQ) migran hacia la syntax de Lambda, pero hay excepciones significativas.

Lambda es más conciso, pero realizar múltiples combinaciones de tablas es una pesadilla. Las uniones son mucho más limpias con la syntax de consulta. La otra cara de la moneda es que hay varias operaciones LINQ que solo existen dentro de la syntax Lambda: Single (), First (), Count (), etc.

Entonces, usa aquello con lo que te sientas más cómodo y date cuenta de que a medida que adquieres experiencia, es probable que tu preferencia cambie. Hay un gran valor para poder leer ambos y ciertamente habrá situaciones en las que tendrá que usar un poco de ambos. Otras situaciones se prestan a un estilo sobre el otro. Al final, todo se traduce al mismo código ejecutable.

Utilizo la syntax que sea más legible para mi consulta, caso por caso.

Siempre que sea posible, trato de evitar mezclar y unir los dos, aunque a veces está bien (si es una sola llamada a First() al final de una consulta, por ejemplo). La ejecución diferida significa que es igual de eficiente usar una expresión de consulta y asignar el resultado a una variable, y luego usar la notación de puntos usando esa variable:

 var query = from x in y orderby z group x by x.Name into groups // etc select foo; var page = query.Skip(50).Take(10); 

Como han dicho otros, las expresiones de consulta simplemente se traducen en C # 3 “normal” sin expresiones de consulta, por lo que no hay ninguna penalización por hacer esto.

Bueno, la notación de ‘punto’ puede ser mucho más corta. Tomar:

 var result = from p in dc.Products where p.Id > 5 select p; 

o:

 var result = dc.Products.Where(p => p.Id > 5); 

Prefiero este último ya que es mucho más corto y más legible.

Encuentro que la notación Lambda es más clara y concisa. Me resulta molesto que si tienes una expresión Lambda en cualquier lugar dentro de una llamada a método, no puedes modificar el código sobre la marcha en modo de depuración …

Comstackn con el mismo código, o más bien el primero se traduce primero al segundo y luego se comstack.

Tiene razón en que la diferencia es que la primera versión es más limpia pero más limitada. En el segundo puede, por ejemplo, usar delegates ya existentes, por ejemplo:

 Func isEven = i => i%2 == 0; Enumerable.Range(10).Where(isEven).ToList().ForEach(Console.WriteLine);