繁体   English   中英

在Entity Framework和ASP.NET Core中使用两个视图的平均评分

[英]Average rating using two views in Entity Framework & ASP.NET Core

我创建了两个模型,请参见下文。 使用实体框架支架来创建控制器和视图。

在“创建评论”页面中,提供了输入int的评论的选项。

但是,在我的专业Healthprofessional指数视图中,我想将平均评分发送给每个保健专业人员。

我已经尝试过在卫生专业剃刀视图中使用foreach语句,但是在剃刀中的每个视图中只能引用一个模型,这对我来说很难。

@foreach (var item in Model.HealthReviews)
{
    // get error for this foreach when I try to apply
    // as item.Rating does not contain  
    // a public definition for getenumerator
    foreach (var rating in item.Rating)
    { }
}

我想将linq应用于控制器可能是答案,但是我在此阶段花费了数小时试图做到这一点,并且对linq不太熟悉。

我将不胜感激关于如何解决此问题的任何建议。

public enum Profession { Counsellor, Physio, Doctor }

public class HealthProfessional
{
    public int ID { get; set; }
    [Required]
    [StringLength(50)]
    [Display(Name = "Name")]
    public string Name { get; set; }
    public bool AcceptsMedicalCard { get; set; }
    [Required]
    [StringLength(80)]
    [Display(Name = "Address")]
    public string Address { get; set; }
    [Required]
    public Profession Profession { get; set; }
    public ICollection<Review> HealthReviews { get; set; }
    public ICollection<Client> Clients { get; set; }
}

public class Review
{
    public int ID { get; set; }
    public int? ClientID { get; set; }
    public int? HealthProfessionalID { get; set; }
    [Required]
    [Range(0, 5, ErrorMessage = "Please select number between 1 and 5")]
    public int Rating { get; set; }

    [Required]
    public string ReviewText { get; set; }
    public bool WouldRecommend { get; set; }
    public virtual Client Client { get; set; }
    public HealthProfessional HealthProfessional { get; set; }
}

您已经遍历了作为ICollection<Review> HealthReviews ,并且每个Review包含一个int Rating 尝试循环遍历是没有意义的,它已经是一个可以直接使用的单一值。

您的代码将需要看起来像这样:

@{
    int sumOfRatings = 0;
    foreach (var item in Model.HealthReviews)
    {
        sumOfRatings += item.Rating;
        // ...
    }

    double averageRating = Model.HealthReviews.Count > 0
        ? (double)sumOfRatings / Model.HealthReviews.Count
        : 0;

    // ...
}

您可以在HealthProfessional类中添加一种方法来计算平均评分。

public class HealthProfessional
{
    public ICollection<Review> HealthReviews { get; set; }

    public double CalculateAverageRating()
    {
        return HealthReviews.Average(r => r.Rating);
    }
}

然后,在Controller动作方法中调用该方法,并将其分配给视图模型的属性。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM