C# 在viewmodel中显示相关数据是更好的方法吗?

C# 在viewmodel中显示相关数据是更好的方法吗?,c#,entity-framework,viewmodel,C#,Entity Framework,Viewmodel,我的目标是在一个表/网格中显示HTML页面中两个表中的数据 身份证、姓名、姓氏、爱好名 表格 人(身份证、名字、姓氏、兴趣证) 爱好(ID,爱好名称) namespace DC.ViewModels { 公共阶层人士HobbyView() { 公共int ID{get;set;} 公共字符串名{get;set;} 公共字符串姓氏{get;set;} 公共字符串名称{get;set;} } 公共阶层的人 { 公共列表PeopleList{get;set;} 公众人物() { 使用(var cont

我的目标是在一个表/网格中显示HTML页面中两个表中的数据

身份证、姓名、姓氏、爱好名

表格

人(身份证、名字、姓氏、兴趣证)

爱好(ID,爱好名称)

namespace DC.ViewModels
{
公共阶层人士HobbyView()
{
公共int ID{get;set;}
公共字符串名{get;set;}
公共字符串姓氏{get;set;}
公共字符串名称{get;set;}
}
公共阶层的人
{
公共列表PeopleList{get;set;}
公众人物()
{
使用(var context=new LSF1617Entities())
{
var people=(来自上下文中的人员。人员在上下文中加入爱好。人员上的爱好。爱好ID等于爱好。ID
选择new PeopleHobbyView{ID=people.ID,Forename=people.Forename,姓氏=people.姓氏,Hobby\u Name=hobbies.Hobby\u Name}
);
this.PeopleList=people.ToList();
}
}
}
}
当然,必须在嗜好表中查找嗜好名称,因此我在我的
GetPeople()
方法中创建了一个联接


这一切似乎有点冗长,我只是想得到保证,这是一个很好的方式去完成任务。我读过一些关于懒惰/急切加载的文章,但我似乎无法完全理解它。

这是使用EF查询数据的一种非常好的方法。如果你愿意,你可以用

它将删除这条线

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);
    }

这是使用EF查询数据的一种非常好的方法。如果你愿意,你可以用

它将删除这条线

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和分配到PeopleList中而不使用var people

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和分配到PeopleList中的var people几乎是正确的

但是,我不会这样做,而是创建两个独立的模型。 一个是“人”,一个是“爱好”。 这使它更容易阅读

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; }
}
公共阶层人士
{
公共int Id{get;set;}
公共字符串名{get;set;}
公共字符串姓氏{get;set;}
公共爱好{get;set;}
}
公共课爱好
{
公共int Id{get;set;}
公共字符串名称{get;set;}
公共ICollection人员{get;set;}
}
在您的上下文中,您可以加载关系。这个方法有一点取决于您是否想进行延迟加载。请阅读本文:


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

您几乎是正确的

但是,我不会这样做,而是创建两个独立的模型。 一个是“人”,一个是“爱好”。 这使它更容易阅读

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; }
}
公共阶层人士
{
公共int Id{get;set;}
公共字符串名{get;set;}
公共字符串姓氏{get;set;}
公共爱好{get;set;}
}
公共课爱好
{
公共int Id{get;set;}
公共字符串名称{get;set;}
公共ICollection人员{get;set;}
}
在您的上下文中,您可以加载关系。这个方法有一点取决于您是否想进行延迟加载。请阅读本文:


只要数据库中存在关系并且加载已设置,无论何时访问人员对象,它都会显示相关的爱好。

关闭延迟加载,使用“包含”明确包含所需的导航属性。快速问题:PeopleList是人员列表,People是人员列表HobbyView,这是怎么回事?人们是从中国继承的吗PeopleHobbyHiew@AndrewKilburn很抱歉,这是我的POST中的一个错误。关闭延迟加载,使用“包含”显式包含所需的导航属性。快速问题:PeopleList是人员列表,People是人员列表HobbyView,这是如何工作的?人们是从中国继承的吗PeopleHobbyHiew@AndrewKilburn很抱歉,这是我帖子中的一个错误。我认为您的数据库逻辑应该不在控制器中?这取决于您使用的模式,我个人将我的db代码存储在存储库中,这样它就可以查看-->控制器-->repo实际上,dbContext和Linq应该在服务层中,而不是控制器层。当然,将模型从dto(linq行)转换为控制器中的视图模型,但不要在控制器中查询数据,这是一种糟糕的代码味道(控制器很难进行单元测试)。我同意这一点,但我不想让Joakhim在存储库和服务层方面负担过重。我的大部分代码看起来像@Ben Jones所描述的。@Neil。控制器不难组合。在本·琼斯描述的情景中。它们可能直接针对DbContext。我以为您的数据库逻辑应该不在控制器中?它是