Expresión fluida y de consulta - ¿Hay algún beneficio(s) de uno sobre otro?


LINQ es una de las mayores mejoras a.NET desde genéricos y me ahorra toneladas de tiempo, y líneas de código. Sin embargo, la sintaxis fluida parece ser mucho más natural para mí que la sintaxis de expresión de consulta.

var title = entries.Where(e => e.Approved)
    .OrderBy(e => e.Rating).Select(e => e.Title)
    .FirstOrDefault();

var query = (from e in entries
             where e.Approved
             orderby e.Rating
             select e.Title).FirstOrDefault();

¿Hay alguna diferencia entre los dos o hay algún beneficio particular de uno sobre el otro?

 238
Author: Uwe Keim, 2008-10-18

13 answers

Tampoco es mejor: sirven a necesidades diferentes. La sintaxis de consulta entra en juego cuando se desea aprovechar múltiples variables de rango. Esto sucede en tres situaciones:

  • Cuando se usa la palabra clave let
  • Cuando tienes múltiples generadores (de cláusulas)
  • Al hacer joins

Aquí hay un ejemplo (de las muestras de LINQPad):

string[] fullNames = { "Anne Williams", "John Fred Smith", "Sue Green" };

var query =
  from fullName in fullNames
  from name in fullName.Split()
  orderby fullName, name
  select name + " came from " + fullName;

Ahora compare esto con lo mismo en la sintaxis del método:

var query = fullNames
  .SelectMany (fName => fName.Split().Select (name => new { name, fName } ))
  .OrderBy (x => x.fName)
  .ThenBy  (x => x.name)
  .Select  (x => x.name + " came from " + x.fName);

Sintaxis del método, en el por otro lado, expone la gama completa de operadores de consulta y es más concisa con consultas simples. Puede obtener lo mejor de ambos mundos mezclando la sintaxis de consulta y método. Esto se hace a menudo en consultas LINQ a SQL:

var query =
  from c in db.Customers
  let totalSpend = c.Purchases.Sum (p => p.Price)    // Method syntax here
  where totalSpend > 1000
  from p in c.Purchases
  select new { p.Description, totalSpend, c.Address.State };
 236
Author: Joe Albahari,
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
2009-05-05 03:20:12

Prefiero usar esta última (a veces llamada "sintaxis de comprensión de consulta") cuando puedo escribir toda la expresión de esa manera.

var titlesQuery = from e in entries
                  where e.Approved
                  orderby e.Rating
                  select e.Titles;

var title = titlesQuery.FirstOrDefault();

Tan pronto como tenga que agregar (paréntesis) y .MethodCalls(), cambio.

Cuando uso el primero, suelo poner una cláusula por línea, así:

var title = entries
    .Where (e => e.Approved)
    .OrderBy (e => e.Rating)
    .Select (e => e.Title)
    .FirstOrDefault();

Me parece un poco más fácil de leer.

 58
Author: Jay Bazuzi,
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
2009-08-26 17:14:23

Cada estilo tiene sus pros y sus contras. La sintaxis de consulta es más agradable cuando se trata de uniones y tiene la útil palabra clave let que facilita la creación de variables temporales dentro de una consulta.

La sintaxis fluida, por otro lado, tiene muchos más métodos y operaciones que no se exponen a través de la sintaxis de consulta. También, ya que son solo métodos de extensión, puede escribir el suyo propio.

He encontrado que cada vez que empiezo a escribir una instrucción LINQ usando la sintaxis de consulta termino teniendo para ponerlo entre paréntesis y volver a usar métodos de extensión LINQ fluido. La sintaxis de consulta simplemente no tiene suficientes características para usar por sí misma.

 29
Author: James Newton-King,
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-03-13 21:57:19

En VB.NET prefiero mucho la sintaxis de consulta.

Odio repetir lo feo Function-palabra clave:

Dim fullNames = { "Anne Williams", "John Fred Smith", "Sue Green" };
Dim query =
     fullNames.SelectMany(Function(fName) fName.Split().
     Select(Function(Name) New With {Name, fName})).
     OrderBy(Function(x) x.fName).
     ThenBy(Function(x) x.Name).
     Select(Function(x) x.Name & " came from " & x.fName)

Esta consulta ordenada es mucho más legible y mantenible en mi opinión:

query = From fullName In fullNames
        From name In fullName.Split()
        Order By fullName, name
        Select name & " came from " & fullName

VB.NET la sintaxis de consulta también es más potente y menos detallada que en C#: https://stackoverflow.com/a/6515130/284240

Por ejemplo, esta consulta LINQ to DataSet (Objects)

VB.NET:

Dim first10Rows = From r In dataTable1 Take 10

C#:

var first10Rows = (from r in dataTable1.AsEnumerable() 
                   select r)
                   .Take(10);
 20
Author: Tim Schmelter,
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
2017-05-23 11:54:50

No obtengo la sintaxis de consulta en absoluto. No hay razón para ello en mi mente. que se puede llegar con .Seleccionar y tipos anónimos. Creo que las cosas se ven mucho más organizadas con la "puntuación".

 14
Author: Instance Hunter,
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
2009-02-28 06:01:32

La interfaz fluida si solo hay un dónde. Si necesito un select or orderby, generalmente uso la sintaxis de Consulta.

 13
Author: James Curran,
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
2008-10-18 03:52:46

La sintaxis fluida parece más poderosa de hecho, también debería funcionar mejor para organizar el código en pequeños métodos reutilizables.

 8
Author: Kozyarchuk,
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
2008-10-18 03:42:24

Sé que esta pregunta está etiquetada con C#, pero la sintaxis fluida es dolorosamente detallada con VB.NET.

 5
Author: Larsenal,
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
2009-08-11 19:45:26

Me gusta mucho la sintaxis Fluida y trato de usarla donde puedo, pero en ciertos casos, por ejemplo, cuando uso joins, generalmente prefiero la sintaxis de Consulta, en esos casos me resulta más fácil de leer, y creo que algunas personas están más familiarizadas con la sintaxis de Consulta (similar a SQL), que con lambdas.

 4
Author: CMS,
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
2008-10-18 03:53:50

Si bien entiendo y me gusta el formato fluido , me he atenido a la consulta por el momento por razones de legibilidad. La gente que acaba de ser presentada a LINQ encontrará Consulta mucho más cómodo de leer.

 4
Author: LizB,
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
2008-10-18 04:19:43

Prefiero la sintaxis de consulta ya que provengo de la programación web tradicional usando SQL. Es mucho más fácil para mí envolver mi cabeza alrededor. Sin embargo, creo que voy a empezar a utilizar el .Donde (lambda) ya que es definitivamente mucho más corto.

 4
Author: Steve Tranby,
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
2008-10-19 05:21:06

He estado usando Linq durante aproximadamente 6 meses. Cuando empecé a usarlo preferí la sintaxis de consulta, ya que es muy similar a T-SQL.

Pero, poco a poco me estoy acercando a lo primero ahora, ya que es fácil escribir trozos reutilizables de código como métodos de extensión y simplemente encadenarlos. Aunque encuentro que poner cada cláusula en su propia línea ayuda mucho con la legibilidad.

 4
Author: Antony Scott,
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
2015-08-14 10:23:56

Acabo de configurar los estándares de nuestra empresa y hacemos cumplir el uso de los métodos de extensión. Creo que es una buena idea elegir uno sobre el otro y no mezclarlos en código. Los métodos de extensión se leen más como el otro código.

La sintaxis de comprensión no tiene todos los operadores y usar paréntesis alrededor de la consulta y agregar métodos de extensión después de todo me ruega por usar métodos de extensión desde el principio.

Pero en su mayor parte es solo preferencia personal con algunas excepciones.

 3
Author: Rodi,
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-12-01 07:25:13