在 viewmodel 中显示相关数据,更好的方法?

Showing related data in viewmodel, a better way?

我的目标是在我的 HTML 页面中将来自两个 table 的数据显示在一个 table/grid 中。

ID, Forename, Surname, Hobby Name

表格

People(ID, Forename, Surname, Hobby ID)

Hobby(ID, Hobby Name)

namespace DC.ViewModels
{

    public class PeopleHobbyView()
    {
        public int ID {get; set;}
        public string Forename {get; set;}
        public string Surname {get; set;}
        public string Hobby_Name {get; set;}
    }

    public class PeopleHobbiesVM
    {
        public List<PeopleHobbyView> PeopleList { get; set; }

        public void GetPeople()
        {
            using (var context = new LSF1617Entities())
            {
                var people = (from people in context.People join hobbies in context.Hobby on people.Hobby_ID equals hobbies.ID
                    select new PeopleHobbyView { ID = people.ID, Forename = people.Forename, Surname = people.Surname, Hobby_Name = hobbies.Hobby_Name}
                );
                this.PeopleList = people.ToList();
            }
        }
    }
}

当然必须在 Hobby table 中查找 Hobby 名称,所以我在我的 GetPeople() 方法中创建了一个连接

这一切似乎有点啰嗦,我只是想确认这是完成任务的好方法。我已经阅读了一些关于 lazy/eager 加载的内容,但我似乎无法完全理解它。

这是使用 EF 查询数据的完美方式。如果你愿意,你可以使用 navigation properties

它将删除这一行

join hobbies in context.Hobby on people.Hobby_ID equals hobbies.ID

因为它将在导航中声明 属性。

至于延迟加载,你真的不会在这种情况下使用它。如果结果很长,您可能需要分页。

我会将此代码移出视图模型并移至控制器操作中。您通常会将上下文传递给控制器​​的构造函数。

public class SomeController : Controller {
    public SomeController(LSF1617Entities dbContext)
    {
        _dbContext = dbContext;
    }

    public ActionResult Index()
    {
        var model = (from people in context.People join hobbies in context.Hobby on people.Hobby_ID equals hobbies.ID
                    select new PeopleHobbyView { ID = people.ID, Forename = people.Forename, Surname = people.Surname, Hobby_Name = hobbies.Hobby_Name}
                ).ToList();

        return View(model);
    }

试试这个

PeopleList = context.People.Include(x => x.Hobby).select(x => new PeopleHobbyView {
      D = x.ID,
      Forename = x.Forename,
      Surname = x.Surname,
      Hobby_Name = x.Hobby.Hobby_Name
}).toList();

没有太大区别,你的方法也很好,唯一的区别是查询末尾的 toList 和在没有 var people 的情况下分配给 PeopleList

你几乎是正确的。

但是,我不会这样做,而是会创建两个单独的模型。 一份用于 'People',一份用于 'Hobbies'。 这样更容易阅读。

public class People
{
   public int Id { get; set; }
   public string Forename { get; set; }
   public string Surname { get; set; }

   public Hobby Hobby { get; set; }
}

public class Hobby
{
   public int Id { get; set; }
   public string Name { get; set; }

   public ICollection<People> People { get; set; }
}

然后您可以在您的上下文中加载关系。这个方法有点取决于你是否想要延迟加载。请阅读这篇文章:

https://msdn.microsoft.com/en-us/data/jj574232.aspx

只要您的数据库中存在关系并且设置了加载,无论何时您访问 People 对象,它也会向您显示相关的爱好。