2011-06-17 10 views
9

Mam proste kwerendy linq, gdzie muszę filtrować sklepy w pewnej odległości, a także zamówić przez wynik obliczenia odległości, masz pomysł.Linq: wywołanie tej samej metody dla Where and OrderBy tylko raz, a nie dwa razy?

Tak więc na razie dwukrotnie wołałem metodę GetDistance. Jak zoptymalizować kod, aby wywołać go tylko raz w sklepie?

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(); 

Odpowiedz

12

Równoważny do odpowiedzi Jurij, że niektórzy ludzie (me) łatwiejszy do odczytu jest:

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(); 

Kompilator po prostu przekłada się to na kod, który wygląda podobnie jak kod Jurij za.

+0

Dziękuję, jestem n00b w 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 ... pobij mnie do tego. –

+0

Czy można to zrobić za pomocą jednego Wybierz, czy wpływa to na wydajność? –

Powiązane problemy