【问题标题】:how to get the average star rating using entity framework .average() method如何使用实体框架 .average() 方法获得平均星级
【发布时间】:2014-07-24 12:00:01
【问题描述】:

我是 mvc 和实体框架的新手,我为产品开发了星级评分系统。我正在尝试获得产品的平均星级,并且我建立了这样的数据库:

用户表 : UserID PK , UserName , StarRatingDetails FK

产品表:ProdactID PK、ProudactName、StarRatingDetails FK

StarRatingDetails : ProdactID PK1 , UserID PK2 , VoteValue

所以我尝试使用实体框架的 .average() 方法来获得平均星级,如下所示:

   var products = db.Products.Include(p => p.StarRatingDetail).ToList();
   var voteCounts = db.StarRatingDetail.ToList();

         foreach (var av in voteCounts)
        {
            var avarage = new { starAvarage = Convert.ToInt32(voteCounts.Average(avv => avv.VoteValue)) };

        }

它可以工作并获取产品的每个平均星级,但我如何才能将平均星级与正确的产品相关联并将其发送到视图?如果还有其他方法,我将非常感谢您的帮助。

【问题讨论】:

    标签: asp.net-mvc entity-framework asp.net-mvc-4


    【解决方案1】:

    假设ProductStartRatingDetail1..* 关系

    var productWithVotes = db.Products.Include(p => p.StarRatingDetail)
                                      .Select(x => new {
                                          Product = x,
                                          VoteAverage = x.StarRatingDetail.Average(r => r.VoteValue)     
                                      });
    

    注意 - 如果集合为空,Average 将引发异常,因此您可能需要在调用它之前进行检查

    VoteAverage = x.StarRatingDetail.Any() ? 
        x.StarRatingDetail.Average(v => v.VoteValue) : 0
    

    Live example

    【讨论】:

    • 它在这一行给我一个错误 VoteAverage = p.StarRatingDetail.Average(r => r.VoteValue) 名称 p 在当前上下文中不存在
    • @Fadi 错字,应该是x
    • 好的,我在 productWithVotes 中添加了一个断点,并在结果视图中给出了这个错误基础 {“转换为值类型 'Double' 失败,因为具体化值为 null。结果类型的通用参数或查询必须使用可为空的类型。"} System.SystemException {System.InvalidOperationException}
    • @Fadi 我在示例中的任何地方都没有转换为Double,显然这是您的代码的一个单独问题。请参阅我链接到的示例。
    • 好的,谢谢你,我尝试了一下,没有强制转换为 int,它工作正常,非常感谢你的帮助
    猜你喜欢
    • 2018-06-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-30
    • 2021-02-27
    相关资源
    最近更新 更多