Las mejores formas de formatear consultas LINQ


Antes de ignorar / votar para cerrar esta pregunta, considero que esta es una pregunta válida porque la claridad del código es un tema importante de discusión, es esencial para escribir código mantenible y apreciaría enormemente las respuestas de aquellos que se han encontrado con esto antes.

Recientemente me he encontrado con este problema, las consultas LINQ pueden ser bastante desagradables muy rápido debido a la gran cantidad de anidamiento.

A continuación se presentan algunos ejemplos de las diferencias en formateo que se me ha ocurrido (para la misma consulta relativamente no compleja)

Sin formato

var allInventory = system.InventorySources.Select(src => new { Inventory = src.Value.GetInventory(product.OriginalProductId, true), Region = src.Value.Region }).GroupBy(i => i.Region, i => i.Inventory);

Formato elevado

var allInventory = system.InventorySources
    .Select(src => 
        new { 
            Inventory = src.Value.GetInventory(product.OriginalProductId, true), 
            Region = src.Value.Region })
                .GroupBy(
                    i => i.Region, 
                    i => i.Inventory);

Formato de bloque

var allInventory = system.InventorySources
    .Select(
        src => new 
        { 
            Inventory = src.Value.GetInventory(product.OriginalProductId, true), 
            Region = src.Value.Region 
        })
        .GroupBy(
            i => i.Region, 
            i => i.Inventory
        );

Formato de lista

var allInventory = system.InventorySources
    .Select(src => new { Inventory = src.Value.GetInventory(product.OriginalProductId, true), Region = src.Value.Region })
    .GroupBy(i => i.Region, i => i.Inventory);

Quiero crear un estándar para el formato linq para que maximice la legibilidad y la comprensión y se vea limpio y profesional. Hasta ahora no puedo decidir así que dirijo la pregunta a los profesionales aquí.

Author: Aren, 2010-05-28

4 answers

Me he decidido por el formato de bloque. Molestó mi sensación de "espacio desperdiciado" por un tiempo, pero al final todo el mundo sintió que era más legible para más personas. Como ya estábamos poniendo llaves en nuevas líneas, encajaba mejor con el resto del código. También hay menos espacio para la interpretación. Mantenemos un archivo cs en la tienda pública que tiene ejemplos de formato...cuando a alguien se le ocurre un trozo único de linq lo agregamos al archivo...realmente ayuda a los chicos nuevos.

 10
Author: Rusty,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-05-27 20:29:10

Mi formato:

var allInventory = system.InventorySources
  .Select(src => new
  {
    Inventory = src.Value.GetInventory(product.OriginalProductId, true),
    Region = src.Value.Region
  })
  .GroupBy(
    i => i.Region,
    i => i.Inventory
  );

Notas:

  • Los paréntesis iniciales de los métodos nunca son dignos de una nueva línea.
  • Los paréntesis de cierre coinciden con la sangría de la línea que contiene el paréntesis de apertura.
  • El src => new permanece en la misma línea que Select, porque simplemente no es digno de una nueva línea.
  • El tipo anónimo siempre recibe tratamiento de bloque, al igual que si se usó fuera de una consulta (pero el paréntesis de cierre no es digno de una nueva línea).
  • Los dos parámetros La sobrecarga de GroupBy no se llama típicamente. Aunque podría caber fácilmente en una sola línea, use una línea adicional para dejar en claro que algo inusual está sucediendo.
 17
Author: Amy B,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-11-20 02:53:39

Para mí, depende de la longitud de la consulta que tengo que hacer. Para declaraciones simples cortas como una selección básica o uniones simples, iré con el formato de lista porque hace que sea agradable y fácil de leer sin poner mi código sobre un montón de líneas.

Si tiendo a tener una instrucción linq bastante compleja o más grande, voy con el formato de bloque para que sea más fácil para otras personas leer y seguir lo que estaba tratando de hacer.

No creo que sea mala práctica tener diferentes formateo para diferentes declaraciones, siempre y cuando esté consistente con la forma en que lo aborda.

 3
Author: Richard Reddy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-05-27 20:28:41

Es muy subjetivo.

Utilizo el método de formato de bloque.

También compruebo el código con Stylecop y me aseguro de que no arroje ninguna advertencia de stylecop.

 0
Author: Pierre-Alain Vigeant,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-11-20 03:03:14