252 votos

LINQ con Fluidez y Expresión de Consulta - ¿hay algún beneficio(s) de uno sobre otro?

LINQ es una de las mejoras más importantes para .NET ya que las medicinas genéricas y me ahorra un montón de tiempo, y las líneas de código. Sin embargo, la fluidez de la sintaxis parece mucho más natural para mí que la sintaxis de expresiones 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 alguna ventaja particular de uno sobre otro?

253voto

Joe Albahari Puntos 13644

Tampoco es mejor: servir a diferentes necesidades. La sintaxis de la consulta viene en su propia cuando se quiere aprovechar de múltiples variables de rango. Esto ocurre en tres situaciones:

  • Cuando se utiliza la palabra clave permiten
  • Cuando usted tiene múltiples generadores (de las cláusulas)
  • Al hacer combinaciones

He aquí un ejemplo (de la LINQPad muestras):

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 la misma cosa en la sintaxis de 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);

La sintaxis de método, por otro lado, expone la gama completa de operadores de consulta y es más concisa con sencillas consultas. Usted puede obtener lo mejor de ambos mundos mediante la mezcla de consulta y la sintaxis de método. Esto se hace a menudo en LINQ to SQL consultas:

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 };

58voto

Jay Bazuzi Puntos 20462

Yo prefiero usar el último (a veces llamado "consulta de la comprensión de la sintaxis"), cuando puedo escribir la expresión completa 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 tengo que añadir (entre paréntesis) y .MethodCalls(), cambio.

Cuando yo uso la primera, que se suele poner una cláusula por la línea, como este:

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

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

29voto

James Newton-King Puntos 13880

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

Fluidez de la sintaxis en la otra mano tiene un montón más de los métodos y operaciones que no están expuestos a través de la sintaxis de la consulta. También, ya que son sólo los métodos de extensión puede escribir su propio.

He descubierto que cada vez que empiezo a escribir una LINQ declaración utilizando la sintaxis de la consulta me terminan de tener que poner en paréntesis y volver a usar con fluidez métodos de extensión de LINQ. La sintaxis de la consulta no tiene suficientes características para su uso por sí mismo.

20voto

Tim Schmelter Puntos 163781

Porque yo soy principalmente un VB.NET desarrollador, estoy absolutamente prefiriendo la sintaxis de la consulta.

No me gusta repetir las feas 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)

Este impecable consulta 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 es la sintaxis de la consulta también es más potente y menos detallado que en C#: http://stackoverflow.com/a/6515130/284240

Por ejemplo este de LINQ to DataSet(Objetos) de la consulta

VB.NET:

Dim first10Rows = From r In dataTable1 Take 10

C#:

var first10Rows = (from r in dataTable1.AsEnumerable() 
                   select r)
                   .Take(10);

13voto

James Curran Puntos 55356

La fluidez en la interfaz si sólo hay un dónde. Si necesito un selecto o orderby, generalmente se usa la sintaxis de la Consulta.

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X