【问题标题】:Select specific columns using EF in MVC 5在 MVC 5 中使用 EF 选择特定列
【发布时间】:2017-05-10 10:45:05
【问题描述】:

我想在 MVC 5 中使用 Entity Framework 获取一些特定的列值。但它显示错误。这是我的控制器方法代码:

public ActionResult Index()
{
    var systemUsers = db.SystemUsers
                        .Include(s => s.SystemUser1)
                        .Select(s => new {
                                          s.FullName, 
                                          s.Email, 
                                          s.Image, 
                                          s.UpdateDate, 
                                          s.UpdatedBy, 
                                          s.Id
                                 });
    return View(systemUsers.ToList());
}

这是错误信息:

传入字典的模型项的类型为'System.Collections.Generic.List1[<>f__AnonymousType16[System.String,System.String,System.String,System.Nullable1[System.DateTime],System.Nullable1[System.Int32] ,System.Int32]]',但此字典需要类型为“System.Collections.Generic.IEnumerable`1[MVC.Models.SystemUser]”的模型项。

再次当我无法获得特定列的单个结果时。默认情况下,控制器方法在尝试使用ajax 时也会返回意外的外键数据。 这是单个结果的代码。

[HttpPost]
public ActionResult Details(int? id)
{
    if (id == null)
    {
       return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
    }
    SystemUser systemUser = db.SystemUsers.Find(id);
    return Json(systemUser);
}

Here is the result in console

【问题讨论】:

  • 您听说过视图模型吗?谷歌它
  • 视图需要强类型视图模型,但您传递的是匿名类型。
  • @Nkosi,在哪里编辑我的代码?

标签: c# asp.net-mvc entity-framework asp.net-mvc-5


【解决方案1】:

视图需要强类型视图模型,但您传递的是匿名类型

更新选择以返回强类型对象集合。

public ActionResult Index()
{
    var systemUsers = db.SystemUsers
                        .Include(s => s.SystemUser1)
                        .Select(s => new SystemUser { //<--HERE
                                         FullName = s.FullName, 
                                         Email = s.Email, 
                                         Image = s.Image, 
                                         UpdateDate = s.UpdateDate, 
                                         UpdatedBy = s.UpdatedBy, 
                                         Id = s.Id
                                 });
    return View(systemUsers.ToList());
}

【讨论】:

    【解决方案2】:

    这里的问题似乎是您的 View 期望 IEnumerable&lt;SystemUser&gt; 作为 View Model,但您提供的是 anonymous type 实例。这就是编译器失败的原因。有几种方法可以解决这个问题:

    1- 让您的 View 采用 dynamic 模型:您不必担心传入的实际实例的 type,但是您赢了'没有 auto-completionintellisense 的优点。

    2- 不要投影 (.Select) 您的收藏并将原始 SystemUser 列表传递给 查看

    3- 创建一个视图模型并列出这些视图模型并将其传递给视图:

    控制器:

    public ActionResult Index()
    {
        var systemUsers = db.SystemUsers
                        .Include(s => s.SystemUser1)
                        .Select(s => new SystemUserViewModel 
                                {
                                    FullName = s.FullName, 
                                    Email = s.Email, 
                                    Image = s.Image, 
                                    UpdateDate = s.UpdateDate, 
                                    UpdatedBy = s.UpdatedBy, 
                                    Id = s.Id
                                 });
        return View(systemUsers)
    }
    

    恕我直言,第三个是最好的。您当然应该使用最适合您需要的那个。希望对您有所帮助

    【讨论】:

    • 他的代码很糟糕,以至于它在控制器中包含查询,现在您建议他将查询SystemUsers 一直发送到视图?这是一个怎样的好建议?我会删除你的第二个建议。
    • @CodingYoshi,大声笑,我试图提供不同的建议,并试图传达ViewsViewModels 的工作方式,而不是太固执己见。这就是我推荐第三种解决方案的原因
    • 但这不是一个好的建议,所以不应该建议。
    猜你喜欢
    • 2014-12-10
    • 1970-01-01
    • 2018-08-02
    • 2017-06-02
    • 2020-08-29
    • 2010-09-22
    • 1970-01-01
    • 2017-02-22
    • 1970-01-01
    相关资源
    最近更新 更多