繁体   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