【问题标题】:Getting averages from different table in Entity Framework从实体框架中的不同表中获取平均值
【发布时间】:2016-12-22 12:01:27
【问题描述】:

我目前有几张桌子,但相关的是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 中,但其他技术也完全可以!

如果我需要详细说明,请告诉我,提前谢谢!

【问题讨论】:

    标签: c# linq


    【解决方案1】:

    Reviews 数量庞大,无论您编写何种优化代码,最终都会变慢。

    更好的方法是在Restaurant 表中添加一个名为AverageRating 的新列。然后编写一段每天(或定期)运行的代码/脚本(Windows 服务或 sql 作业)并更新此列中的值。 (您可以根据各种因素进行优化,例如当天哪家酒店获得了新评分等)

    这边:

    1. 您可以准备好仅使用 Linq 过滤的平均值。
    2. 您不会再次计算所有平均值,因为您的方法又被调用了一次。
    3. 因此可以节省大量资源。

    是的,这实施起来会很费时间,但是是的,从长远来看会解决手头的问题

    【讨论】:

    • 谢谢!我对 EF 没有太多经验,有什么可以推荐/链接的吗?
    • 不一定是 EF。如果您熟悉 C#,您应该了解如何编写 Windows 服务,如何安排它。您可以像现在一样与数据库通信。
    【解决方案2】:
    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);
    }
    

    【讨论】:

    • 一家餐厅没有评论列表。我可以从上下文中的其他表中获取这些吗?
    • @Bas,哦,我明白了。等一下
    • @Bas smth like this
    猜你喜欢
    • 1970-01-01
    • 2020-12-21
    • 2018-06-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-27
    • 1970-01-01
    • 2018-01-02
    相关资源
    最近更新 更多