Ways to skin a LINQ query
Quite naturally, the very first step to understand LINQ is to go behind curtain and see how the magic select/where statement works. Although this has been explained many, many, many times, I still couldn't resist the temptation:
public class Customer { public string Name { get; internal set; } public int Age { get; internal set; } } //... List<Customer> list = ...; var ret = from s in list orderby s.Age descending where s.Name == "Ming" select s;First, let's take out the syntax sugar out of the query. It's then equivalent to:
Func<Customer, bool> p1 = c => c.Name == "Ming"; Func<Customer, int> p2 = c => c.Age; return list.Where(p1).OrderByDescending(p2);Still, this uses Lambda Expression. Taking that out, we have:
var ret = list.Where<Customer>( new Func<Customer, bool>( delegate(Customer c) { return c.Name == "Ming"; } )); ret = ret.OrderByDescending<Customer, int>( new Func<Customer, int>( delegate(Customer c) { return c.Age; } ));And finally, without the Extension Method and var magic, the C# 2.0 way to write the query:
IEnumerable<Customer> ret = System.Linq.Enumerable.Where<Customer>( list, new Func<Customer, bool>( delegate(Customer c) { return c.Name == "Ming"; } )); ret = System.Linq.Enumerable. OrderByDescending<Customer, int>( ret, new Func<Customer, int>( delegate(Customer c) { return c.Age; } ));It's now clear that LINQ is a compiler feature plus corresponding library support (System.Linq.Enumerable, for example). There really isn't anything new from CLR point of view.