【问题标题】:asp mvc repository patten dealing with complex queries and viewModels处理复杂查询和视图模型的 asp mvc 存储库模式
【发布时间】:2017-05-12 08:51:21
【问题描述】:

在实现 UOW 和存储库模式之前,我曾经创建条件查询并从我的服务层返回搜索结果:

例如:

`

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 和存储库模式做同样的事情,因为我无法直接查询实体,而且从存储库返回 iqueryable 是不好的做法。

我检查了许多 SO 帖子,似乎找不到解决方案。

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

`

【问题讨论】:

    标签: asp.net-mvc repository-pattern


    【解决方案1】:

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

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

    【讨论】:

    • 所以我的存储库将返回一个视图模型
    • List&lt;IssueSearchResult&gt; 将从 IssueRepository 返回。但据我了解,存储库不应该返回视图模型,如果我在这里错了,请纠正我
    • 这是我在上面评论中提到的链接:softwareengineering.stackexchange.com/questions/344336/…
    • Repository 返回域模型(实体)或投影。然后你必须使用 Automapper 将它们映射到视图模型中。您找到的链接很好地解释了这一点。 IssueSearchResult 可以是投影,您可以将其映射到 IssueSearchResultViewModel 类,该类将具有一些服务属性或简单的逻辑。
    • 是的,域模型和视图模型不一样。将它们分开是很好的做法。此外,如果您想了解 UnitOfWork 和存储库模式,您可以阅读有关依赖注入的内容。
    猜你喜欢
    • 2014-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-23
    • 2017-02-08
    相关资源
    最近更新 更多