Nel precedente post ho mostrato come le lambda expression non sono assolutamente la stessa cosa che un delegate anonimo, la ragione è che il compilatore può tradurre una lambda expression in due modi molto differenti, il primo è semplice codice IL, proprio come un delegate anonimo, mentre il secondo è un Expression Tree. La IQueryable, che è l'interfaccia utilizzata da LINQ to SQL, accetta quindi nel where due cose distinte, un delegate di tipo Func<T, Boolean> oppure un Expression<Func<T, Boolean>>, il compilatore se presente preferisce sempre compilare con una Expression, ecco perchè LINQ2SQL è in grado di tradurre lo StartsWith()...