![](/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.