2008-10-18 19 views
228

LINQ es una de las mayores mejoras de .NET desde genéricos y me ahorra muchísimo tiempo y líneas de código. Sin embargo, la sintaxis fluida parece ser mucho más natural para mí que la sintaxis de la expresión de consulta.LINQ - Expresión fluida y de consulta: ¿hay alguna ventaja de una sobre otra?

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 otro?

+36

creo que el camino se hace la pregunta es bastante constructivo. Decir que no es porque la respuesta es * tampoco * es, de hecho, la parte más * no constructiva * de esta página. –

+0

Para consultas complejas, encuentro que la sintaxis lambda es más comprensible/legible, pero la sintaxis de las consultas simplemente es más bonita. – nawfal

+2

Esta es una pregunta constructiva precisamente porque la respuesta es que ambas son equivalentes. Leí la pregunta preguntando si hay otras consideraciones además de la preferencia sintáctica para elegir una sobre la otra. Esta es información importante para saber sobre LINQ. –

Respuesta

225

Ni es mejor: que sirven para diferentes necesidades. La sintaxis de consulta se resuelve cuando desea aprovechar variables de rango múltiple. Esto ocurre en tres situaciones:

  • Cuando se utiliza la palabra clave let
  • Cuando haya varios generadores (de cláusulas)
  • Al hacer une a

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 sa Me cosa 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, por el contrario, expone toda la gama de operadores de consulta y es más concisa con consultas simples. Puede obtener lo mejor de ambos mundos mezclando sintaxis de consulta y método. Esto se suele hacer en LINQ a las consultas 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 }; 
+1

Buena respuesta. ¿Me puede decir un poco más sobre lo que ".Select (name => new {name, fName})" está haciendo? – quillbreaker

+10

Selecciona la palabra individual (anne, williams, john, etc.) junto con el nombre completo en un tipo anónimo. Esto le permite "llevar" el nombre completo original para que tenga acceso tanto al nombre completo como a la palabra individual en el resto de la consulta. –

7

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

12

La interfaz fluida si hay solo un lugar. Si necesito seleccionar o ordenar, generalmente uso la sintaxis de consulta.

3

Me gusta mucho la sintaxis Fluent y trato de usarla donde puedo, pero en ciertos casos, por ejemplo, cuando uso uniones, generalmente prefiero la sintaxis Query, 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 Query (SQL), que lambdas.

3

Si bien entiendo y como el formato de fluidez, me he pegado a Query por el momento, por razones de legibilidad. Las personas que acaban de ser presentadas a LINQ encontrarán Query mucho más cómodo de leer.

26

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

sintaxis Fluido por el contrario tiene mucho más métodos y operaciones que no están expuestos a través de la sintaxis de la consulta. Además, dado que solo son métodos de extensión, puedes escribir los tuyos.

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

+0

"ya que solo son métodos de extensión que puede escribir usted mismo". - ¿Encontrarías este problema? http://stackoverflow.com/a/3850254/1175496 –

52

Yo prefiero usar este último (a veces llamada "la comprensión de sintaxis 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 tengo que añadir (paréntesis) y .MethodCalls(), puedo cambiar.

Cuando utilizo el primero, me 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 que un poco más fácil de leer.

3

prefiero la sintaxis de consulta como vine de programación web tradicional mediante SQL. Es mucho más fácil para mí entender bien. Sin embargo, creo que comenzaré a utilizar el .Where (lambda) ya que definitivamente es mucho más corto.

13

No obtengo la sintaxis de la consulta en absoluto. Simplemente no hay razón para eso en mi mente. let se puede lograr con. Seleccionar y tipos anónimos. Simplemente creo que las cosas se ven mucho más organizadas con la "puntuación" allí.

+8

Las combinaciones múltiples pueden ser bastante laboriosas con bastante rapidez con la sintaxis fluida. Sin embargo, en general uso fluidamente, a menos que participen las uniones. –

+0

@Instance Hunter: Lo mismo aquí. Me tomó bastante tiempo comenzar a comprender la idea de una sintaxis fluida. En combinación con el poderoso enumerable y la idea de funciones "puras", ahora realmente lo disfruto, y situaciones anteriormente difíciles que no tenían una buena representación del código. Para ye-ole-SQL-parte del cerebro, todavía es una bendición tener una sintaxis de consulta. –

3

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

Pero, voy a ir poco a poco y vuelta a la antigua ahora, ya que es fácil de escribir trozos de código reutilizables como los métodos de extensión y justo encadenarlos juntos. Aunque encuentro que poner cada cláusula en su propia línea ayuda mucho con la legibilidad.

4

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

2

que acabo de establecer normas de nuestra empresa y hacer 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 el código. Los métodos de extensión leen más como el otro código.

sintaxis La comprensión no tiene todos los operadores y utilizando paréntesis alrededor de la consulta y añadir los métodos de extensión después de todo, sólo me plantea para el uso de los métodos de extensión desde el principio.

Pero en su mayor parte es simplemente preferencia personal con unas pocas excepciones.

+3

No haré cumplir las preferencias personales ... Pero ese soy yo. –

18

En VB.NET prefiero la sintaxis de la consulta.

odio a 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 fácil de mantener en mi opinión:

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

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

Por ejemplo, esta consulta LINQ to DataSet (Objetos)

VB.NET:

Dim first10Rows = From r In dataTable1 Take 10 

C#:

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

Mis simpatías para los desarrolladores de VB que no pueden usar el estilo de consulta. – nawfal

+4

... o deje de usar VB ... :) – enorl76

+1

Su último ejemplo de C# es demasiado simplista para ser valioso: simplemente escribiría 'dataTable1.AsEnumerable(). Take (10); – Emyr

Cuestiones relacionadas