object不包含Id的定义

时间:2015-06-04 18:49:07

标签: c# linq asp.net-mvc-5

错误:

  

{“'object'不包含'Id'的定义。”}

视图模型

public class PilotoVM
{
    private FormulaEntities1 db = new FormulaEntities1();

    public IQueryable<object> calcularValoracion()
    {
        return db.Piloto.GroupBy(p => p.id).Select(p => new { Id = p.Key, Valoracion = p.Sum( i=> i.agresividad + i.paciencia + i.reflejos + i.valentia + i.valentia)});
    }
}

控制器

public ActionResult Index()
{
    ViewBag.valoracion = pilotoVM.calcularValoracion();
    return View(piloto.ToPagedList(pageNumber, pageSize));
}

查看

@foreach (var pil in ViewBag.valoracion)
{
    <p>@pil.Id</p>
    <p>@pil.Valoracion</p>
}

pil.Id

中的错误

2 个答案:

答案 0 :(得分:0)

你应该创建一个代表你的Id和Valoracian的强类型对象,或者你可以使用一个元组。

public List<Tuple<int, int>> calcularValoracion()
{
    return db.Piloto
        .GroupBy(p => p.id)
        .Select(p => new Tuple<int, int>(
            p.Key, 
            p.Sum(i => i.agresividad + i.paciencia + i.reflejos + i.valentia + i.valentia))
        .ToList();
}

查看

@foreach (var pil in ViewBag.valoracion)
{
    @pil.Item1
    @pil.Item2
}

请注意查询末尾的.ToList()。这会将您的查询解析为内存集合,这样您就不会将上下文泄漏到视图中。

最后,C#中的方法名称应该是Pascal Cased,例如CalcularValoracion()

答案 1 :(得分:0)

您的方法calcularValoracion()返回一个匿名对象。匿名类型是内部的,无法在视图中访问(请参阅this article以获得更好的解释)。

而是创建一个视图模型来表示数据

public class PilotoVM
{
  public int Id { get; set; }
  public int Valoracion { get; set; }
}

然后在控制器中

List<PilotoVM> model = db.Piloto.GroupBy(p => p.id).Select(p => new PilotoVM()
{
  Id = p.Key, 
  Valoracion = p.Sum( i=> i.agresividad + i.paciencia + i.reflejos + i.valentia + i.valentia)
}).ToList();

现在,您可以将强类型模型返回到视图中,并在循环中访问每个PilotoVM对象的属性。