MVC4:使用实体检索相关列表并将其转换为List<>或IEnum<> for View Model

时间:2015-06-28 01:26:30

标签: c# asp.net-mvc asp.net-mvc-4

这是一个简单的项目,用户可以按专业领域搜索职位发布。区域和过帐之间的关系是多对多的。我似乎能够到达检索正确过滤列表的最后一部分,但回到视图模型不断给我不同的错误:

视图模型:

    public class AreaOfertasViewModel
{
    public Oferta UnaOferta { get; set; }
    public SelectList AreasTrabajo { get; set; }
    public IEnumerable<Oferta> Ofertas { get; set; }
    public int idArea { get; set; }

    public AreaOfertasViewModel()
    {
        this.UnaOferta = UnaOferta;
        this.Ofertas = new List<Oferta>();
        cargarAreas();
    }

    private void cargarAreas()
    {
        PostulaOfertaContext db = new PostulaOfertaContext();
        this.AreasTrabajo = new SelectList(db.Areas, "areaId", "Area");
    }
}

}

控制器:

        public ActionResult SearchXArea()
    {
        return View(new AreaOfertasViewModel());
    }

    [HttpPost]
    public ActionResult SearchXArea(AreaOfertasViewModel aovm)
    {
        int id = aovm.idArea;
        PostulaOfertaContext db = new PostulaOfertaContext();
        var area = db.Areas.Where(c => c.areaId == id);
        var ofertas = from c in db.Ofertas.Where(r => r.AreaTrabajo == area)
                      select c;
        aovm.Ofertas = (IEnumerable<Oferta>)ofertas.ToList();
        return View(aovm);
    }

给我提问的方法是 aovm.Ofertas =(IEnumerable)ofertas.ToList();

我已尝试过List&lt;&gt;对于Ofertas来说,我已经尝试将它作为.ToList()而没有强制转换,并将其作为不同的东西进行投射,但是它给了我关于无法投射它的错误,并且&#34;无法比较类型的元素&#39; System.Collections.Generic.List`1&#39 ;.仅支持原始类型,枚举类型和实体类型。&#34;

这里的解决方案是什么?

AreaTrabajo的模型:

    public class AreaTrabajo
{
    [Key]
    public int areaId { get; set; }
    public string Area { get; set; }
    public virtual List<Oferta> oferta { get; set; }
}

Oferta模特:

    public class Oferta
{
    [Key]
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }
    [Required]
    public string Titulo { get; set; }
    [Required]
    public DateTime Vencimiento { get; set; }
    [Required]
    public string Cargo { get; set; }
    [Required]
    public int HorarioComienzo { get; set; }
    [Required]
    public int HorarioFin { get; set; }
    [Required]
    public string DescripcionTareas { get; set; }
    public int Remuneracion { get; set; }
    [Required]
    public int RangoEdadMin { get; set; }
    [Required]
    public int RangoEdadMax { get; set; }
    public string TipoFormacion { get; set; }
    public string Idiomas { get; set; }
    public string Competencias { get; set; }
    public string OtrosEstudios { get; set; }
    public string Estado { get; set; }
    public virtual List<AreaTrabajo> AreaTrabajo { get; set; } 
    public virtual TipoContrato TipoContrato { get; set; }          
    public virtual Empresa Empresa { get; set; }

    public virtual List<Postulante> Postulantes { get; set; }
}

答案

 [HttpPost]
    public ActionResult SearchXArea(AreaOfertasViewModel aovm)
    {
        int id = aovm.idArea;
        PostulaOfertaContext db = new PostulaOfertaContext();
        var area = db.Areas.Where(c => c.areaId == id).FirstOrDefault();

        var ofertas = db.Ofertas.Where(s => s.AreaTrabajo.All(e => e.areaId == area.areaId)).ToList();
        aovm.Ofertas = ofertas;
        return View(aovm);
    }

很抱歉,如果我的问题不够明确。我需要从多对多关系中过滤掉,这解决了它。

2 个答案:

答案 0 :(得分:0)

您收到错误,因为在调用tolist()时会执行实际的sql。错误发生在您的sql中,因为您正在将AreaTrabago与列表进行比较。

答案 1 :(得分:0)

 [HttpPost]
    public ActionResult SearchXArea(AreaOfertasViewModel aovm)
    {
        int id = aovm.idArea;
        PostulaOfertaContext db = new PostulaOfertaContext();
        var area = db.Areas.Where(c => c.areaId == id).FirstOrDefault();

        var ofertas = db.Ofertas.Where(s => s.AreaTrabajo.All(e => e.areaId == area.areaId)).ToList();
        aovm.Ofertas = ofertas;
        return View(aovm);
    }

很抱歉,如果我的问题不够明确。我无法获得多对多关系,这完全解决了过滤问题。