2013-04-24 16 views
9

Sto utilizzando Entity Framework nel mio ASP.NET, C#, Web Application. Se devo selezionare un record da DataBase (in Data Access Layer), quale metodo dovrei usare? Query Linq o espressione lambda?query Linq o espressione lambda?

Ad esempio: -

//Linq   
var result = from a in db.myTable.Take(1) where a.Id == varId select a; 
return result.First(); 

//Lambda 
return db.myTable.FirstOrDefault(a => a.Id == varId); 

Esiste un modo preferito in questo scenario o alcun vantaggio sopra l'altro?

+5

Usa quello che vuoi. (BTW: non stanno facendo la stessa cosa) – I4V

+1

possibile duplicato di [LINQ - Sintassi delle query e catene dei metodi e lambda] (http://stackoverflow.com/questions/8037677/linq-query-syntax-vs-method-chains -lambda) – I4V

risposta

14

L'espressione di query viene compilata in Method Expression (espressione Lambda), quindi non dovrebbe esserci alcuna differenza, nel codice se si accede a First e FirstOrDefault che si comporterebbero diversamente.

See: Query Syntax and Method Syntax in LINQ (C#)

e LINQ Query Expressions (C# Programming Guide)

Al momento della compilazione, le espressioni di query vengono convertiti in standard Query metodo Operatore chiamate in base alle regole stabilite nel disciplinare di C# . Qualsiasi query che può essere espressa utilizzando la sintassi della query può anche essere espressa utilizzando la sintassi del metodo. Tuttavia, nella maggior parte dei casi la sintassi della query è più leggibile e concisa.

+2

+1 per i link msdn –

+0

E le allocazioni? – dariol

0

Immagino che il risultato sia lo stesso. Lambda è solo un po 'più comoda. Se hai bisogno di un risultato di una sola tabella, l'espressione lambda è molto veloce e leggibile.

5

La sintassi della query di Linq è solo uno zucchero di sintassi per i metodi di espressione. Qualsiasi query Linq compilata nei metodi di espressione. Btw vostra prima query:

var query = from a in db.myTable.Take(1) 
      where a.Id == varId 
      select a; 
return query.First(); 

è equivalente a

return db.myTable.Take(1).Where(a => a.Id == varId).First(); 
3

Entrambi i vostri tentativi utilizzare LINQ.

Il primo registra un record e verifica se l'ID corrisponde.

Il secondo prende il primo record in cui l'ID corrisponde.

Questa è una differenza.

0

Ogni espressione di query può essere espressa come codice C# utilizzando le chiamate per interrogare gli operatori come metodi di estensione. Ma il contrario non è vero; solo un piccolo sottoinsieme degli operatori di query standard può essere utilizzato come parole chiave nelle espressioni di query. In altre parole, le espressioni di query presentano alcune limitazioni che il meccanismo di chiamata al metodo non ha:

  1. Alcuni operatori di query non hanno semplicemente un'espressione di query C# equivalente, ad es. ToArray().
  2. Non è possibile utilizzare tutti i tipi di overload nelle espressioni di query di C#. Per esempio. c'è un sovraccarico di Select() che attende l'indice dell'oggetto attualmente iterato; non è possibile chiamare questo overload all'interno di un'espressione di query.
  3. Non possiamo usare le istruzioni lambdas nelle espressioni di query. - Questo è il motivo per cui gli inizializzatori di oggetti e raccolte sono stati introdotti nel linguaggio C#.