Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 3 使用即时加载和自定义业务逻辑构建Asp.Net IEnumerable ViewModels_Asp.net Mvc 3 - Fatal编程技术网

Asp.net mvc 3 使用即时加载和自定义业务逻辑构建Asp.Net IEnumerable ViewModels

Asp.net mvc 3 使用即时加载和自定义业务逻辑构建Asp.Net IEnumerable ViewModels,asp.net-mvc-3,Asp.net Mvc 3,型号: 视图模型: public class Company { public string Name {get;set;} } public class JobListing { public string Title {get;set;} public Company Company {get;set;} public bool JobListingHasRecommendation {get;set;} } 存储库方法: public class JobListingV

型号:

视图模型:

public class Company
{
  public string Name {get;set;}
}
public class JobListing
{
  public string Title {get;set;}
  public Company Company {get;set;}

  public bool JobListingHasRecommendation {get;set;}
}
存储库方法:

public class JobListingVM
{
   public string Title {get;set;}
   public string CompanyName {get;set;}

   public string TitleAtCompany 
   {
      get
      {
         return string.Format("{0} at {1}", Title, CompanyName);
      }
   }

}
public IEnumerable getAllJobs()
{
返回dbContext.JobListings;
}
控制器操作:

public IEnumerable<JobListing> getAllJobs()
{
   return dbContext.JobListings;
}
public ActionResult Index()
{
var jobs=repository.getAllJobs();//作业现在已从dbcontext断开连接
//假设有数千个工作(我们将进行分页)
//现在我们使用一些类似自动映射的魔法将IEnumerable转换为
//数不清
}
问题是getAllJobs必须加载公司属性 自动映射过程依赖于这些知识 或者Automap为N个职位运行N个查询以获得公司-这显然是一种糟糕的做法

而解决这个问题的方法可能是在 那么,当一个人不想要急切的负载时,会发生什么情况呢。 我们需要许多组合存储库方法来提供所有的急/缓加载(使用 潜在嵌套的紧急负载等)场景

VieModel的JobListingHasRecommension属性也是一个问题,因为它需要涉及db查询的自定义业务逻辑来设置它,因此需要为IEnumerable的所有成员按JobListing进行设置。在存储库调用之后在控制器中执行此操作是混乱的,在自动映射中执行此操作需要在自动映射构造中注入一个IRepository

模型到ViewModels的映射不像我看到的所有自动映射示例那样简单。我很少看到模型列表映射到ViewModels列表的示例,每个ViewModel的JobListingHas建议都必须单独计算。这里存在性能和体系结构问题,因为自动映射服务现在还必须具有数据库访问权限

我的问题是-既然ViewModels存储的数据可能是复杂计算和连续数据库访问的结果,那么创建这些类型ViewModel的IEnumerable的最佳实践是什么


谢谢

通过Include()指定要加载的内容,并返回ToList()

返回dbContext.JobListings.Include(o=>o.Customers.ToList()//或者任何你想要的东西
您是否尝试过只用于查询轻型模型的存储库?基本上,存储库将直接返回视图模型(或其部分)。存储库将负责查询orm并仅获取所需的列。您当前的存储库方法不起任何作用,只能选择所需的数据,然后这些数据将直接映射到视图模型。MikeSW-如何确定同一实体的许多不同子选择(或包含)的返回类契约?您可以使用select和include be方法参数(select使用动态linq,include参数使用EF string include功能),但是对于这种灵活的select repo方法,返回类型是什么?
public ActionResult Index()
{
   var jobs = repository.getAllJobs();//jobs is now disconnected from the dbcontext

   //let's say there are a thousands of jobs (and we will be paging)

   //now we use some Automap like magic to convert the IEnumerable<JobListing> into        
   //IEnumerable<JobListingVM>


}
return dbContext.JobListings.Include(o=>o.Customers).ToList(); //or whatever you want to eager load