【问题标题】:Linq to View error, Passing Generic List : Required IEnumerableLinq 查看错误,传递通用列表:必需 IEnumerable
【发布时间】:2013-08-22 14:45:55
【问题描述】:

Visual Studio 2012 互联网应用 MVC4 C#

错误

System.InvalidOperationException:传入字典的模型项的类型为'System.Data.Entity.Infrastructure.DbQuery1, but this dictionary requires a model item of type 'System.Collections.Generic.IEnumerable1

我的视图期望:@model IEnumerable<OG.Models.UserProfiles> 这是一个数据模型而不是 ViewModel。 *此视图也是我创建控制器时UserProfiles 模型生成的视图(Standart Scaffolding with @Html.DisplayNameFor(model => model.Company) 和后来的@foreach (var item in Model) { 列出数据`

我的控制器尝试:

  • 尝试 1 知道(不返回列表)

    return View(db.UserProfiles
                 .Include(c => c.Roles)
                 .Where(c => c.Roles.Any(up => up.RoleName != "Administrator"))
                 .Select(c => new
                 {
                     UserID = c.UserID,
                     UserName = c.UserName,
                     UserCount = c.Roles.Count()
                 }));
    
  • 尝试 2 知道(不返回列表)

            var model =
                from usr in db.UserProfiles
                join rls in db.UserRoles on usr.Roles equals rls.RoleId
    
                select new { UserID = usr.UserID, UserName = usr.UserName };
    
  • 尝试 3 知道(不返回列表)

            var model =
               from usr in db.UserProfiles.Include(t => t.Roles)
               where usr.Roles.Any(up => up.RoleName != "Administrator")
               select new WebAdminUsersLookup
               {
                   UserID = usr.UserID,
                   UserName = usr.UserName
               };
    
  • 尝试 4 猜这不是“真实”列表,仍然是错误

    var listOfIdeas = 
         (from x in db.UserProfiles.Include(t => t.Roles)
         .Where(u => u.Roles.Any(up => up.RoleName != "Administrator"))
         select new { UserID = x.UserID, UserName = x.UserName }).ToList();
    
  • 对于尝试 1-3

            List<UserProfiles> modelList = new List<UserProfiles>();
            modelList.Add(model.ToList());
    

类似的东西,为他们创建了一个 Viewmodel

    private class WebAdminUsersLookup
    {
        //public List<UserProfiles> Users { get; set; }
        public int UserID { get; set; }
        public string UserName { get; set;}
    }

搜索的网站:

【问题讨论】:

    标签: asp.net-mvc linq-to-entities viewmodel


    【解决方案1】:

    如果您的视图需要IEnumerable&lt;OG.Models.UserProfiles&gt;,那么这就是您应该传递给它的内容,而不是您在 LINQ 查询中投射的一些匿名对象。如果IEnumerable&lt;OG.Models.UserProfiles&gt; 不足以满足您的视图需求并且您需要更多信息,那么您最好创建一个视图模型:

    public class MyViewModel
    {
        public int UserID { get; set; }
        public string UserName { get; set; }
        public int RolesCount { get; set; }
    }
    

    然后在这个视图模型上投影:

    IEnumerable<MyViewModel> model = db
        .UserProfiles
        .Include(c => c.Roles)
        .Where(c => c.Roles.Any(up => up.RoleName != "Administrator"))
        .Select(c => new MyViewModel
        {
            UserID = c.UserID,
            UserName = c.UserName,
            RolesCount = c.Roles.Count()
         });
    
    return View(model);
    

    最后使您的视图强类型化为与您在控制器操作中传递的模型相同的模型:

    @model IEnuemrable<MyViewModel>
    

    【讨论】:

    • 感谢感谢,我仍然习惯于 MVC 中的类型,这对我有用,只需要处理我的 Linq 查询,显然它不会显示任何人,不管管理员角色与否,但那既不是这里也不是那里。谢谢! +1
    【解决方案2】:

    将您的模型转换为列表并将其传递给您的视图,如下所示:

     var model = db.UserProfiles
     .Include(c => c.Roles)
     .Where(c => c.Roles.Any(up => up.RoleName != "Administrator")).ToList();
    
     return View(model);
    

    【讨论】:

    • 感谢您提供有用的答案,但我也将其用于(需要 IEnumerable 的标准视图()):) - 抱歉没有指定。 +1 好答案
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-03
    相关资源
    最近更新 更多