Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/14.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 处理复杂查询和视图模型的asp mvc存储库模式_Asp.net Mvc_Repository Pattern - Fatal编程技术网

Asp.net mvc 处理复杂查询和视图模型的asp mvc存储库模式

Asp.net mvc 处理复杂查询和视图模型的asp mvc存储库模式,asp.net-mvc,repository-pattern,Asp.net Mvc,Repository Pattern,在实现UOW和Repository模式之前,我用于创建条件查询并从我的服务层返回搜索结果: 例如: ` private IQueryable GetIssuesQuery(){ var query=(来自Dbcontext.Issues中的iss) 在iss.PrId上的Dbcontext.purchaserequisions中加入pr等于pr.PrId 其中iss.IssueDate>=SearchCriteria.FromDate&&iss.IssueDate x.IssueId); } 公

在实现UOW和Repository模式之前,我用于创建条件查询并从我的服务层返回搜索结果:

例如:

`

private IQueryable GetIssuesQuery(){
var query=(来自Dbcontext.Issues中的iss)
在iss.PrId上的Dbcontext.purchaserequisions中加入pr等于pr.PrId
其中iss.IssueDate>=SearchCriteria.FromDate&&iss.IssueDate x.IssueId);
}
公共异步任务GetAsyncIssues(){
列表问题=新列表();
试一试{
issues=等待GetIssuseQuery().ToListSync();
}
捕获(数据异常){
投掷;
}
退货问题;
}
现在,我无法找到如何使用UOW和存储库模式执行相同的操作,因为我无法直接查询实体,而且从存储库返回iqueryable是一种不好的做法

我已经检查了许多这样的帖子,似乎找不到解决办法

这是否意味着我应该完全放弃存储库模式


`

您的存储库将包含实体框架上下文属性,因此您将使用它进行查询。存储库方法将返回列表或单个对象。就像我在这个小例子中展示的一样

 public UnitofWork : IDisposable 
{
    private DBData Context;//context you can recieve from injection or from static method 
    public IssueRepository Issues => here goes method to check that you have only one repository of this type with this context
}

public class IssueRepository{
   constructor that takes dbContext

   public async Task<List<IssueSearchResult>> GetAsyncIssues() 
{
     List<IssueSearchResult> issues = new List<IssueSearchResult>();
try {
    issues = await context.Issues.Where(expression).Select(x => new IssueSearchResult()
                 {
                     IssueId = iss.IssueId,
                     IssueNo = iss.IssueNumber,
                     IssueDate = iss.IssueDate,
                     PrNo = pr.DocumentNumber,
                         CreatedByName = iss.User.FullName
                     }).ToListAsync();
}
catch (DataException) {
    throw;
}
return issues;
}
}
公共工作单元:IDisposable { private DBData Context;//可以从注入或静态方法接收的上下文 public IssueRepository Issues=>下面是检查您是否只有一个具有此上下文的此类存储库的方法 } 公共类发行人{ 接受dbContext的构造函数 公共异步任务GetAsyncIssues() { 列表问题=新列表(); 试一试{ issues=wait context.issues.Where(表达式)。选择(x=>newissueSearchResult()) { IssueId=iss.IssueId, IssueNo=iss.IssueNumber, IssueDate=iss.IssueDate, PrNo=pr.DocumentNumber, CreatedByName=iss.User.FullName }).ToListAsync(); } 捕获(数据异常){ 投掷; } 退货问题; } }
您还可以使用投影类和Automapper或其他库将结果映射到viewmodel并返回。

因此我的存储库将返回一个viewmodel
列表,该列表将从IssueRepository返回。但据我所知,存储库不应该返回viewmodels,如果我错了,请纠正我这是我在上面的评论中提到的链接:存储库返回域模型(实体)或投影。然后,您必须使用Automapper将它们映射到viewmodel。你找到的链接很好地解释了这一点。IssueSearchResult可以是投影,您可以将其映射到IssueSearchResultViewModel类,该类将具有一些服务属性或简单逻辑。是的,域模型和视图模型不同。把它们分开是很好的做法。此外,若您想了解UnitOfWork和存储库模式,可以阅读有关依赖项注入的内容。
 public UnitofWork : IDisposable 
{
    private DBData Context;//context you can recieve from injection or from static method 
    public IssueRepository Issues => here goes method to check that you have only one repository of this type with this context
}

public class IssueRepository{
   constructor that takes dbContext

   public async Task<List<IssueSearchResult>> GetAsyncIssues() 
{
     List<IssueSearchResult> issues = new List<IssueSearchResult>();
try {
    issues = await context.Issues.Where(expression).Select(x => new IssueSearchResult()
                 {
                     IssueId = iss.IssueId,
                     IssueNo = iss.IssueNumber,
                     IssueDate = iss.IssueDate,
                     PrNo = pr.DocumentNumber,
                         CreatedByName = iss.User.FullName
                     }).ToListAsync();
}
catch (DataException) {
    throw;
}
return issues;
}
}