【问题标题】:Average method not working asp.net core code first:平均方法首先不起作用的 asp.net 核心代码:
【发布时间】:2018-10-17 15:37:21
【问题描述】:

2 个模型类:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.ComponentModel.DataAnnotations;

namespace CareCompProj.Models
{
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 double CalculateAverageRating()
    {
        var averageRating = HealthReviews.Average(r => r.Rating);


        return averageRating;
    }
    public ICollection<Client> Clients { get; set; }
    }
}




using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.ComponentModel.DataAnnotations;

namespace CareCompProj.Models
{
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; }
  }
}

我的两个问题是

  1. 当我使用在 Healthprofessional 类中创建的方法时,我得到 ArgumentNullException: Value cannot be null。 参数名称:来源

例如

@foreach (var item in Model){
<p> @item.CalculateAverageRating() </p>
}
  1. 如果我使用在 Healthprofessional Index 控制器方法中创建的 ViewBag。这将返回 Microsoft.EntityFrameworkCore.Query.Internal.EntityQueryable1[&lt;&gt;f__AnonymousType22[CareCompProj.Models.HealthProfessional, System.Double]]

当我转到应该评分的页面 URL 时。

这是我在尝试获得平均评分时在剃刀视图中引用的 ViewBag(在 healthprofessional 控制器索引方法中创建)

 ViewBag.profRatings = _context.HealthProfessionals.Include(p => p.HealthReviews)

 ViewBag.profRatings = _context.HealthProfessionals.Include(p => p.HealthReviews)
                              .Select(x => new
                              {
                                  HealthProfessional = x,
                                  RatingAverage = x.HealthReviews.Any() ?
                                  x.HealthReviews.Average(v => (v.Rating)) : 0
                              });

卫生专业人员使用的剃须刀索引视图

@model IEnumerable<CareCompProj.Models.HealthProfessional>

对此的任何帮助将不胜感激。谢谢

【问题讨论】:

  • 如果你得到一个ArgumentNullException,那是因为HealthReviews 是null - 确保在将模型传递给视图之前填充它(不要使用ViewBag)

标签: c# asp.net-mvc razor entity-framework-core average


【解决方案1】:

您实际上需要在设置ViewBag 或使用return View(model) 从请求传回之前,通过在控制器操作中调用ToList() 来实现结果,以便执行查询并将结果集填充到内存中List&lt;T&gt;.

所以对于您的 linq 查询,请执行以下操作:

var model = _context.HealthProfessionals.Include(p => p.HealthReviews)
                          .Select(x => new
                          {
                              HealthProfessional = x,
                              RatingAverage = x.HealthReviews.Any() ?
                              x.HealthReviews.Average(v => (v.Rating)) : 0
                          }).ToList();

现在要么在返回时将其传回查看:

return View(model);

或者您可以设置ViewBag.profRatings,然后在视图中使用它。

更新:

您可以创建一个特定于您的视图要求的 ViewModel,例如:

public class HealthProfessionalVM
{

   public HealthProfessional HealthProfessional { get; set; }
   public int RatingAverage { get ;set; }
}

然后在控制器操作中填充它而不是创建匿名对象:

var vm = _context.HealthProfessionals.Include(p => p.HealthReviews)
                          .Select(x => new HealthProfessionalVM
                          {
                              HealthProfessional = x,
                              RatingAverage = x.HealthReviews.Any() ?
                              x.HealthReviews.Average(v => (v.Rating)) : 0
                          }).ToList();

return View(vm);

现在将您的视图强输入IEnumerable&lt;HealthProfessionalVM&gt; 并像这样迭代它:

@model IEnumerable<HealthProfessionalVM>

foreach(var item in Model) 
{ 
   <p> @item.RatingAverage </p>
}

希望对你有帮助。

【讨论】:

  • 您好,谢谢您的回答。我已在我的控制器中应用它并将其分配给 ViewBag.profRatings = model;接下来我使用@foreach (var item in Model){

    @ViewBag.profRatings

    } 在我的索引视图中调用它不幸的是我仍然得到 System.Collections.Generic.List1[&lt;&gt;f__AnonymousType22[CareCompProj.Models. HealthProfessional,System.Double]] 平均数应该在我的表中。有什么想法吗?
  • 你需要写:foreach(var item in ViewBag.profRatings as IEnumerable&lt;HealthProfessional&gt;) { &lt;p&gt; @item.RatingAverage &lt;/p&gt;
  • States healthprofessional 不包含 RatingAverage 的定义,如果我在 razor 视图中执行此操作并且 Rating Average 带有红色下划线。这是你的意思吗?
  • 你需要一个视图模型类而不是匿名对象
  • 我对您的答案应用了最新更新,并进行了一些细微的修改以匹配我的项目结构并且它有效。我非常感谢你:)
猜你喜欢
  • 2019-09-17
  • 2017-05-22
  • 1970-01-01
  • 2019-12-06
  • 2020-07-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-24
相关资源
最近更新 更多