无法使用集合初始值设定项初始化类型,因为它未实现' System.Collections.IEnumerable'

时间:2018-04-01 15:23:21

标签: c# asp.net-mvc view controller viewmodel

主菜单有3个实体。和子菜单。我创建了菜单视图模型。

我的实体:

MainMenu.cs:

public UstMenuler()
{
    AltMenuler = new HashSet<AltMenuler>();
}

public int ID { get; set; }
public string Name { get; set; }
public bool AktifMi { get; set; }
public int YetkiID { get; set; }
public string ControllerName { get; set; }
public string ActionName { get; set; }
public virtual Yetkilendirme Yetkilendirme { get; set; }
public virtual ICollection<AltMenuler> AltMenuler { get; set; }

SubMenu.cs:

public partial class AltMenuler
{      
    public AltMenuler()
    {
        UstMenuler = new HashSet<UstMenuler>();
    }

    [DatabaseGenerated(DatabaseGeneratedOption.None)]
    public int ID { get; set; }
    public int? YetkiID { get; set; }
    public string Name { get; set; }
    public string ActionName { get; set; }
    public string ControllerName { get; set; }
    public virtual Yetkilendirme Yetkilendirme { get; set; }
}     

MyViewModel:

public class MenuViewModel
{
    public UstMenuler UstMenuler { get; set; }
    public AltMenuler AltMenuler { get; set; }
}

我的控制器:

dbContext = new MarkettingDbContext();

int sessionYetkiID = (int)Session["yetkiID"];
MenuViewModel menuler = new MenuViewModel();

var query = (from menu in dbContext.UstMenuler
             where (menu.YetkiID == sessionYetkiID)
             select new MenuViewModel
             {
                 menuler.UstMenuler.ID = menu.ID,
                 menuler.UstMenuler.Name = menu.Name,
                 menuler.UstMenuler.YetkiID = menu.YetkiID,
                 menuler.UstMenuler.ControllerName = menu.ControllerName,
                 menuler.UstMenuler.ActionName = menu.ActionName
             }).ToList();

执行查询时出错。例如我的sessionID是1,我想要我的主要和子菜单。

1 个答案:

答案 0 :(得分:3)

问题是你的对象初始化器:

select new MenuViewModel
{
    menuler.UstMenuler.ID = menu.ID,
    menuler.UstMenuler.Name = menu.Name,
    menuler.UstMenuler.YetkiID = menu.YetkiID,
    menuler.UstMenuler.ControllerName = menu.ControllerName,
    menuler.UstMenuler.ActionName = menu.ActionName
}

首先,你在对象初始值设定项中使用menuler,我不知道为什么。接下来,您尝试分配给子属性,即使它进行编译,也会产生NullReferenceException。总的来说,这基本上不是你想做的事情:)

相反,我会使用以下两个选项之一。

如果您很乐意将UstMenuler参数从menu参数复制到新的视图模型实例中,您可以非常轻松地执行此操作:

select new MenuViewModel { UseMenuler = menu }

或者,如果您要创建新的UstMenuler并从menu复制属性:

select new MenuViewModel
{
    UstMenuler = new UstMenuler
    {
        ID = menu.ID,
        Name = menu.Name,
        YetkiID = menu.YetkiID,
        ControllerName = menu.ControllerName,
        ActionName = menu.ActionName
    }
}

无论哪种方式,您都不需要您在其他任何地方使用的menuler变量。

听起来你正在使用LINQ to Entities,听起来你可能想要将数据库查询部分与投影部分分开。在您的情况下,最简单的方法是避免查询表达式语法,因此您可以轻松地调用AsEnumerable。例如:

var query = dbContext.UstMenuler
    .Where(menu => menu.YetkiID == sessionYetkiID)
    .AsEnumerable() // Do the projection in-process
    .Select(menu => new MenuViewModel
                    {
                        UstMenuler = new UstMenuler
                        {
                            ID = menu.ID,
                            Name = menu.Name,
                            YetkiID = menu.YetkiID,
                            ControllerName = menu.ControllerName,
                            ActionName = menu.ActionName
                        }
                    })
    .ToList();