2013-03-18 2 views
2

동일한 LET 변수를 사용하는 여러 LINQ 쿼리가 있는데, 어떻게 든 미리 정의하고 싶습니다.LINQ에서 LET을 정의합니다.

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 = b.coordinates. 
     Select(c => c.position). 
     FirstOrDefault(). 
     Distance(DbGeography.FromText(currentLocation, 4326)) 
    let distance_to_last_from_me = b.coordinates. 
     OrderByDescending(c => c.sequence). 
     Select(d => d.position). 
     FirstOrDefault(). 
     Distance(DbGeography.FromText(currentLocation, 4326)) 
    let distance_to_from_me = distance_to_first_from_me < distance_to_last_from_me ? 
     distance_to_first_from_me : 
     distance_to_last_from_me 
    where b.endpoints.Any(e => values.Any(t => t == e.town.town_id)) 
    select new RouteQueryModel 
    { 
     b = b, 
     distance_to_from_me = distance_to_from_me.Value, 
     avg_rating = avg_rating 
    } 
); 

내가 사용하는 세 가지 distance_to 내가 내 쿼리에서 사용할 수있는 것들에 대한 템플릿을 만들 수있는 방법이, 8 개 개의 다른 쿼리에서 LET가?

+0

모두가 같은 방법에서 일어나는 이러한 쿼리입니까? – dasblinkenlight

+0

다른 방법 –

답변

5

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

이 쿼리에서 사용하려면, 당신은 단순히 그들을 호출 할 수 있습니다

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) 
    // ... 
+0

WHERE 문을 제외하고 전체 쿼리를 미리 컴파일하는 것이 좋습니다. –

+0

그건 꽤 많이 선호하는 문제입니다. 내가 선호하는 접근 방법은 쿼리를 메서드로 추출하고 술어 함수를 전달하는 것입니다 :'RouteQuery (route => {return route.endpoints.Any (...);})' – fjdumont

관련 문제