在 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 对象,它也会向您显示相关的爱好。
我的目标是在我的 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 对象,它也会向您显示相关的爱好。