Following my anal retentive attention to the tightness of LINQ code and SQL it generates, I decided to refactor an old piece of code that extracted identifiers of the accounts matching certain criteria. Being very smug with all the newly acquired knowledge, I quickly produced an equivalent of:
var activeAccounts = crm.AccountSet .Where(a => a.Name.StartsWith("Bar")) .Select (a => a.Id); foreach (var id in activeAccounts) { Console.WriteLine("{0}", id); }
To my horror, this code generated an equivalent of “select *” SQL statement (ok, it listed the columns explicitly but it listed all columns), neutralizing all my efforts. Explicit column name, on the other hand, generated mean and lean SQL:
var activeAccounts = crm.AccountSet .Where(a => a.Name.StartsWith("Bar")) .Select (a => a.AccountId);
object.Id is a very handy abstraction, but when it comes to LINQ, it’s a leaky one.