LINQ – Sintaxis de consulta vs cadenas de métodos y lambda

¿Alguien se atiene a las reglas (o está obligado a cumplir con las reglas de su empleador?) Cuando elige usar la syntax de consulta LINQ o una expresión Lambda dentro de uno de los métodos de extensión LINQ? Esto se aplica a cualquier Entidad, SQL, Objetos, cualquier cosa.

En nuestro lugar de trabajo, a mi jefe no le gusta lambda en absoluto y utilizaría la syntax de consulta para cualquier cosa, que en algunos casos, considero que son menos legibles.

var names = collection.Select(item => item.Name); var names = from item in collection select item.Name; 

Tal vez cuando agrego una condición, la Lambda que encuentro se vuelve un poco desordenada, donde el

 var names = collection.Where(item => item.Name == "Fred") .Select(item => item.Name); var names = from item in collection where item.Name == "Fred" select item.Name; 

Solo por interés: ¿cómo trata el comstackdor este? ¿Alguien sabe cómo la consulta LINQ anterior se comstackrá en lambda? ¿Se llamará a la propiedad Name para cada elemento? ¿Podríamos hacer esto y posiblemente mejorar el rendimiento? ¿Esto significa que lambda es un poco más controlable en términos de rendimiento?

 var names = collection.Select(item => item.Name) .Where(name => name == "Fred"); 

Ciertamente, cuando comenzamos a usar más y más expresiones, la lambda se vuelve desordenada y comenzaría a usar la syntax de la consulta aquí.

 var names = collection.Where(item => item.Name == "Fred") .OrderBy(item => item.Age) .Select(item => item.Name); var names = from item in collection where item.Name == "Fred" order by item.Age select item.Name; 

También hay algunas cosas que encuentro que no se pueden hacer con la syntax de la consulta. Algunos de ellos pensarían que serían realmente simples (particularmente funciones agregadas), pero no, deben agregar uno de los métodos de extensión LINQ hasta el final, que imo, se ve más ordenado con una expresión lambda.

 var names = collection.Count(item => item.Name == "Fred"); var names = (from item in collection where item.Name == "Fred" select item).Count() 

Incluso para algunas de las cadenas lambda simples, ReSharper sugiere que las convierta en consultas de LINQ.

¿Alguien más puede agregar a esto? ¿Alguien tiene sus propias pequeñas reglas o su compañía sugiere / fuerza el uso de una?

    Para responder a su pregunta sobre la traducción, la expresión de consulta siempre se traducirá según las reglas en 7.16 de la especificación C # 4 (o su equivalente en la especificación C # 3). En el ejemplo en el que hace la pregunta sobre la propiedad Name , no se trata de la traducción de la expresión de consulta, es lo que hacen los métodos Select y Where con los delegates o los árboles de expresión que toman como parámetros. A veces tiene sentido hacer una proyección antes de filtrar, a veces no.

    En cuanto a las reglas pequeñas, solo tengo una: use la que sea más legible para la consulta en cuestión. Entonces, si la consulta cambia y “qué forma es más legible” cambia al mismo tiempo, cambie la syntax utilizada.

    Si vas a utilizar LINQ, deberías contentarte con la syntax, por lo menos para leer.

    SelectMany a encontrar que las consultas con múltiples variables de rango (por ejemplo, mediante SelectMany o Join , o una cláusula let ) terminan siendo más legibles usando expresiones de consulta, pero eso está lejos de ser una regla difícil y rápida.