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

use*_*479 1 c# asp.net-mvc controller view viewmodel

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

我的实体:

主菜单.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; }
Run Code Online (Sandbox Code Playgroud)

子菜单.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; }
}     
Run Code Online (Sandbox Code Playgroud)

我的视图模型:

public class MenuViewModel
{
    public UstMenuler UstMenuler { get; set; }
    public AltMenuler AltMenuler { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我的控制器:

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();
Run Code Online (Sandbox Code Playgroud)

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

Jon*_*eet 8

问题是您的对象初始值设定项:

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
}
Run Code Online (Sandbox Code Playgroud)

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

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

如果您很乐意UstMenulermenu参数中的引用复制到新的视图模型实例中,那么您可以非常轻松地做到这一点:

select new MenuViewModel { UseMenuler = menu }
Run Code Online (Sandbox Code Playgroud)

或者,如果您想创建一个新的UstMenuler并从menu以下位置复制属性:

select new MenuViewModel
{
    UstMenuler = new UstMenuler
    {
        ID = menu.ID,
        Name = menu.Name,
        YetkiID = menu.YetkiID,
        ControllerName = menu.ControllerName,
        ActionName = menu.ActionName
    }
}
Run Code Online (Sandbox Code Playgroud)

无论哪种方式,您都不需要您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();
Run Code Online (Sandbox Code Playgroud)