2016-12-21 1 views
1

현재 여러 테이블이 있지만 관련 테이블은 RestaurantReview입니다. 각 레스토랑은 여러 개의 리뷰를 가질 수 있지만 리뷰에는 1 개의 레스토랑 만 있습니다.Entity Framework의 다른 테이블에서 평균 가져 오기

이제 데이터베이스에서 레스토랑을 검색 할 때 각 레스토랑의 리뷰에서 평균 등급을 원합니다.

나는 주어진 위치까지의 거리에 따라 음식점을 선택한다.

현재, 나는 여기까지 입수했습니다 :

public IEnumerable<Restaurant> GetRestaurantsCloseToCoords(DbGeography coordinates, int amountOfRestaurants) 
{ 
    using (var ctx = _context) 
    { 
     var data = ctx.Restaurants.OrderBy(x => x.Address.Coordinates.Distance(coordinates)) 
      .Take(amountOfRestaurants) 
      .ToList(); 

     return data; 
    } 
} 

내 레스토랑 객체는 다음과 같습니다

public class Restaurant 
{ 
    public Guid Id { get; set; } 
    public string Name { get; set; } 
    public Address Address { get; set; } 
    public List<Tag> Tags { get; set; } = new List<Tag>(); 
    public int PriceRange { get; set; } 
    public double AverageRating { get; set; } 
} 

내가 그 목록의 각 레스토랑에 대한 루프를 사용하고 평균을 계산할 수 있습니다, 그러나 나는 그것이 매우 느리다라고 꽤 확신한다.

나를 도울 수있는 사람이 있습니까? 나는 이것을 LINQ에 유지하고 싶지만, 다른 테크니크들은 완전히 괜찮습니다!

더 자세히 설명해야한다면 미리 알려주세요.

답변

2

여러분이 작성한 최적화 코드가 무엇이든 상관없이, 많은 것들이 결국 느려질 것입니다.

AverageRating이라는 Restaurant 테이블에 새 열을 추가하는 것이 더 나은 방법입니다. 그런 다음 매일 (또는 주기적으로) 실행되고이 열의 값을 업데이트하는 코드/스크립트 (Windows 서비스 또는 SQL 작업)를 작성하십시오. 당신은 단지 Linq에를 사용하여 필터링 할 준비가 평균 것

  1. :

    이 방법을 (당신은이 호텔은 그 날에 새로운 등급을 가지고 같은 다양한 요인 등을 기반으로이를 최적화 할 수 있습니다).

  2. 메서드에 대한 다른 호출이 있었기 때문에 모든 평균을 다시 계산하지는 않습니다.
  3. 상당한 양의 리소스가 이렇게 저장됩니다.

예,이 구현하는 데 소요되는 시간이 될 것입니다,하지만 그래, 레스토랑 그래도 리뷰의 목록이없는 장기

+0

고마워요! EF에 대한 많은 경험이 없지만 추천/링크 할 수있는 것이 있습니까? – RandomStranger

+0

반드시 EF에 관한 것은 아닙니다. C#에 익숙하다면 Windows 서비스를 작성하는 방법과 그 서비스를 예약하는 방법을 확인해야합니다. 현재와 ​​동일한 방식으로 데이터베이스와 통신 할 수 있습니다. – bit

+0

괜찮을 것입니다, 고마워요! – RandomStranger

1
using (var ctx = _context) 
{ 
    var data = ctx.Restaurants 
      .OrderBy(x => x.Address.Coordinates.Distance(coordinates)) 
      .Take(amountOfRestaurants) 
      .Select(t=> new { Restaurant = t, Rating = ctx.Reviews.Where(c=>c.RestaurantId == t.Id).Select(c=>c.Rating).Avg()}) 
      .ToList(); 

    foreach(t in data) 
    { 
     t.Restaurant.AverageRating = t.Rating; 
    } 

    return data.Select(t=>t.Restaurant); 
} 
+0

손에서 문제를 해결할 것입니다. 문맥에서 다른 테이블에서 가져갈 수 있습니까? – RandomStranger

+0

@Bas, 오, 알았어. 잠깐만 기다려주십시오 – Backs

+0

@Bas smth like this – Backs