簡體   English   中英

從Entity Framework中的不同表格獲取平均值

[英]Getting averages from different table in Entity Framework

我目前有幾個表,但相關的表是RestaurantReview 每個餐廳可以有多個評論,但一個評論只有1個餐廳。

現在,當我從數據庫中檢索餐館時,我希望從每個餐館的評論中獲得它們的平均評分。

我根據到給定位置的距離選擇餐廳。

目前,我已經做到了:

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

我可以使用for循環並為該列表中的每個餐廳計算平均值,但是我敢肯定它的速度非常慢。

有誰可以幫助我嗎? 我寧願將此保留在LINQ中,但其他技術也完全可以!

讓我知道是否需要詳細說明,在此先感謝!

擁有大量的Reviews ,無論您編寫什么優化代碼,事情最終都會變慢。

更好的方法是在Restaurant表中添加一個名為AverageRating的新列。 然后編寫一段每天(或定期)運行的代碼/腳本(Windows服務或sql作業)並更新此列中的值。 (您可以根據多種因素對此進行優化,例如當天哪家酒店獲得了新的評價等等)

這條路:

  1. 您將准備好平均值,僅使用Linq進行過濾。
  2. 您不會再次計算所有平均值,僅是因為有另一個方法調用。
  3. 這樣可以節省大量資源。

是的,這將很耗時實施,但是,是的,它將長期解決當前的問題

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM