![](/img/trans.png)
[英]Getting a list of entities from a table leads to 500 error - Entity Framework
[英]Getting averages from different table in Entity Framework
我目前有幾個表,但相關的表是Restaurant
和Review
。 每個餐廳可以有多個評論,但一個評論只有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作業)並更新此列中的值。 (您可以根據多種因素對此進行優化,例如當天哪家酒店獲得了新的評價等等)
這條路:
是的,這將很耗時實施,但是,是的,它將長期解決當前的問題
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.