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?
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 };
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.
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.
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);
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".
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.
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.
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.
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.
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.
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.
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.
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.
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