Espressione fluida e di query - C'è qualche vantaggio dell'uno rispetto all'altro?


255

LINQ è uno dei maggiori miglioramenti a .NET sin dalla generica e mi fa risparmiare un sacco di tempo e linee di codice. Tuttavia, la sintassi fluida mi sembra molto più naturale della sintassi dell'espressione della query.

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();

C'è qualche differenza tra i due o c'è qualche beneficio particolare dell'uno rispetto all'altro?


1
Per le query complesse, trovo la sintassi lambda più comprensibile / leggibile, ma la sintassi delle query è semplicemente più carina.
nawfal,

Risposte:


255

Né è meglio: soddisfano esigenze diverse. La sintassi della query diventa unica quando si desidera sfruttare più variabili di intervallo . Ciò accade in tre situazioni:

  • Quando si utilizza la parola chiave let
  • Quando hai più generatori ( dalle clausole)
  • Quando si fa join

Ecco un esempio (dagli esempi 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;

Ora confronta questo con la stessa cosa nella sintassi del metodo:

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 sintassi del metodo, d'altra parte, espone l'intera gamma di operatori di query ed è più concisa con query semplici. Puoi ottenere il meglio da entrambi i mondi mescolando la sintassi di query e metodo. Questo è spesso fatto nelle query LINQ to 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 };

2
Bella risposta. Puoi dirmi qualcosa in più su cosa sta facendo ".Select (name => new {name, fName})"?
Quillbreaker

12
Seleziona la singola parola (anne, williams, john, ecc.) Insieme al nome completo in un tipo anonimo. Ciò consente di "portare" il nome completo originale in modo da avere accesso sia al nome completo che alla singola parola nel resto della query.
Joe Albahari,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.