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 或其他一些库将结果映射到视图模型并返回。