2011-06-17 11 views
9

Tengo una consulta de linq simple donde necesito filtrar tiendas dentro de una cierta distancia y también ordenar por el resultado del cálculo de distancia, se entiende la idea.Linq: llamando al mismo método para Dónde y Pedido¿Por una sola vez en lugar de dos veces?

Así que terminé llamando al método GetDistance dos veces por el momento. ¿Cómo puedo optimizar el código para llamarlo solo una vez por tienda?

double distance = 50; 

var result = stores.Where<MyStore>(s => 
       Helper.GetDistance(lat, lon, s.Lat, s.Lon) <= distance) 
       .OrderBy(s => Helper.GetDistance(lat, lon, s.Lat, s.Lon)) 
       .ToList(); 

Respuesta

12

Un equivalente a la respuesta de Yuriy que algunas personas (yo) encuentran más fácil de leer es:

double maxDistance = 50; 
var query = from store in stores 
      let storeDistance = Helper.GetDistance(lat, lon, store.lat, store.lon) 
      where storeDistance < maxDistance 
      orderby storeDistance 
      select store; 
var result = query.ToList(); 

El compilador simplemente se traduce esto en código que se parece mucho a código de Yuriy.

+0

¡Gracias, estoy n00b en linq! –

12
var result = stores.Select(store => 
    new 
    { 
     distance = 
      StoreHelper.Current.GetDistance(latitude, longitude, store.Latitude.Value, store.Longitude.Value), 
     store 
    }) 
    .Where(a => a.distance <= distance) 
    .OrderBy(a => a.distance) 
    .Select(a => a.store) 
    .ToList(); 
+0

arg ... vencerme a él. –

+0

¿Es posible hacerlo con un Select, afecta el rendimiento? –

Cuestiones relacionadas