In part 1 we learned that you can swap parts of an Expression Tree to another compatible (i.e. with a matching return type) expression. Swapping is, in fact, the easiest thing to do - with a bit more work we can construct a serializable representation of almost any bit of C# code. This opens great avenues for Domain Driven Development and introducing hot-swappable, dynamic, yet safe parts of logic to your application.
One of the best examples of the power we get is shown by introducing a reusable expression function with LINQKit.
internal static class AddressSubqueries
{
internal static Expression<Func<string, string, string>> FormatCityAndProvince =
(city, province) => "The glorious city of " + city
+ " of the wonderful province of " + province;
}
//used like this:
public IQueryable<string> GetStandardAddressDescription(int addressId)
{
return DataContext
.Addresses.AsExpandable() // this hooks in LINQKit
.Where(x => x.AddressId == addressId)
.Join(
DataContext.StateProvinces,
adr => adr.StateProvinceId,
prov => prov.StateProvinceId,
(adr, prov) => AddressSubqueries.
FormatCityAndProvince // <==
.Invoke(adr.City, prov.Name))
.FirstOrDefault();
}