Se qualcuno fosse convinto che le lambda expression sono solamente Syntactic Sugar per esprimere delegate anonimi potrà essere piacevolmente sorpreso da questo esempio in LINQ to SQL.
FirstTestDataContext context = new FirstTestDataContext();
context.Log = Console.Out;
IEnumerable<Customer> custs = context.Customers
.Where(C => C.CustomerID.StartsWith("A"));
Console.WriteLine("Recuperati {0} oggetti Customer", custs.Count());
custs = context.Customers
.Where(delegate(Customer C) { return C.CustomerID.StartsWith("A"); });
Console.WriteLine("Recuperati {0} oggetti Customer", custs.Count());
In sostanza la prima query usa una lambda expression del tipo C => C.CustomerID.StartsWith("A") e la seconda usa invece un delegate anonimo ma il codice è lo stesso. Osserviamo le query che vengono eseguite.
SELECT [t0].[CustomerID], [t0].[CompanyName], [t0].[ContactName], [t0].[Contact
itle], [t0].[Address], [t0].[City], [t0].[Region], [t0].[PostalCode], [t0].[Cou
try], [t0].[Phone], [t0].[Fax]
FROM [dbo].[Customers] AS [t0]
WHERE [t0].[CustomerID] LIKE @p0
-- @p0: Input NVarChar (Size = 2; Prec = 0; Scale = 0) [A%]
-- Context: SqlProvider(Sql2005) Model: AttributedMetaModel Build: 3.5.21022.8
Recuperati 4 oggetti Customer
SELECT [t0].[CustomerID], [t0].[CompanyName], [t0].[ContactName], [t0].[Contact
itle], [t0].[Address], [t0].[City], [t0].[Region], [t0].[PostalCode], [t0].[Cou
try], [t0].[Phone], [t0].[Fax]
FROM [dbo].[Customers] AS [t0]
-- Context: SqlProvider(Sql2005) Model: AttributedMetaModel Build: 3.5.21022.8
Come si può facilmente vedere la prima query che fa uso di lambda expression è molto efficiente perchè effettua direttamente una query con l'operatore LIKE, mentre la seconda recupera tutti gli oggetti customer dal database e poi li filtra con il delegate anonimo che è stato definito.
Lascio a voi il capire il perchè ;), ma questo basti per far capire che una lambda expression è qualcosa di più che "Syntactic Sugar".
Alk.