There is an easy way to pre-compile LINQ Queries:
var distanceToFirstFromMe =
CompiledQuery.Compile<Route, GeoCoordinates, Distance>((route, currentLocation) => {
return route.coordinates
.Select(c => c.position)
.FirstOrDefault()
.Distance(DbGeography.FromText(currentLocation, 4326));
});
To use them in your query, you can simply call them:
IQueryable<RouteQueryModel> query =
(from b in db.routes
let avg_rating = b.ratings.Any() ?
b.ratings.Select(r => r.rating1).Average() : 0
let distance_to_first_from_me = distanceToFirstFromMe(b, currentLocation)
// ...