asp 处理复杂查询和视图模型的 mvc 存储库模式
asp mvc repository patten dealing with complex queries and viewModels
在实施 UOW 和存储库模式之前,我曾经创建条件查询和 return 从我的服务层搜索结果:
例如:
`
private IQueryable<IssueSearchResult> GetIssuesQuery() {
var query = (from iss in Dbcontext.Issues
join pr in Dbcontext.PurchaseRequisitions on iss.PrId equals pr.PrId
where iss.IssueDate>=SearchCriteria.FromDate && iss.IssueDate<=SearchCriteria.ToDate
select new IssueSearchResult()
{
IssueId = iss.IssueId,
IssueNo = iss.IssueNumber,
IssueDate = iss.IssueDate,
PrNo = pr.DocumentNumber,
CreatedByName = iss.User.FullName
});
// if(condition){
// query = query.where(etc);
//}
return query.OrderBy(x => x.IssueId);
}
public async Task<List<IssueSearchResult>> GetAsyncIssues() {
List<IssueSearchResult> issues = new List<IssueSearchResult>();
try {
issues = await GetIssuesQuery().ToListAsync();
}
catch (DataException) {
throw;
}
return issues;
}
现在我无法弄清楚如何使用 UOW 和存储库模式来做同样的事情,因为我无法直接查询实体,而且从存储库中 return 可查询是不好的做法。
我检查了很多 SO post,但似乎找不到解决方案。
这是否意味着我应该完全放弃存储库模式?
`
您的存储库将包含 entity framework 上下文 属性,因此您将使用它进行查询。存储库方法将 return 您列出或单个对象。就像我在这个小例子中展示的那样。
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;
}
}
您还可以使用投影 类 和 Automapper 或其他一些库将结果映射到视图模型并返回。
在实施 UOW 和存储库模式之前,我曾经创建条件查询和 return 从我的服务层搜索结果:
例如:
`
private IQueryable<IssueSearchResult> GetIssuesQuery() {
var query = (from iss in Dbcontext.Issues
join pr in Dbcontext.PurchaseRequisitions on iss.PrId equals pr.PrId
where iss.IssueDate>=SearchCriteria.FromDate && iss.IssueDate<=SearchCriteria.ToDate
select new IssueSearchResult()
{
IssueId = iss.IssueId,
IssueNo = iss.IssueNumber,
IssueDate = iss.IssueDate,
PrNo = pr.DocumentNumber,
CreatedByName = iss.User.FullName
});
// if(condition){
// query = query.where(etc);
//}
return query.OrderBy(x => x.IssueId);
}
public async Task<List<IssueSearchResult>> GetAsyncIssues() {
List<IssueSearchResult> issues = new List<IssueSearchResult>();
try {
issues = await GetIssuesQuery().ToListAsync();
}
catch (DataException) {
throw;
}
return issues;
}
现在我无法弄清楚如何使用 UOW 和存储库模式来做同样的事情,因为我无法直接查询实体,而且从存储库中 return 可查询是不好的做法。
我检查了很多 SO post,但似乎找不到解决方案。
这是否意味着我应该完全放弃存储库模式?
`
您的存储库将包含 entity framework 上下文 属性,因此您将使用它进行查询。存储库方法将 return 您列出或单个对象。就像我在这个小例子中展示的那样。
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;
}
}
您还可以使用投影 类 和 Automapper 或其他一些库将结果映射到视图模型并返回。