Asp.net mvc 处理复杂查询和视图模型的asp mvc存储库模式
在实现UOW和Repository模式之前,我用于创建条件查询并从我的服务层返回搜索结果: 例如: `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); } 公
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;
}
}