对两个没有关系的表使用存储库模式

Using Repository Pattern for two tables without relation

如何使用 C# 中的存储库模式从两个 table 中获取数据,而无需在数据库中设置它们之间的关系?例如,我有一个 table 用于学生,一个 table 用于详细信息:

public class Student{
    public int Id{get;set;}
    public string Name{get;set;}
    public int GenderId{get;set;}
}

public class DetailsLookup{
    public int Id{get;set;}
    public string Name{get;set;}
}

我从 DetailsLookup.IdGenderId 设置了数据,但它并没有在数据库中创建它们之间的关系。

我在我的代码和工作单元中使用存储库模式。我有个想法 return StudentViewModel.

public class StudentViewModel{
    public int Id{get;set;}
    public string Name{get;set;}
    public int GenderId{get;set;}
    public int GenderName{get;set;}
}

But based on what I read here,我们无法 return 从存储库中查看 models/DTOs。

有人可以帮我解决这个问题吗?

如果您担心 return从存储库中获取视图模型,请单独获取记录并将它们合并到服务层中。

存储库方法:

public async Task<Student> FetchStudentByIdAsync(int id)
{
   return _context.Student.Where(x=>x.Id==id).FirstOrDefaultAsync();
}

public async Task<DetailsLookup> FetchDetailByIdAsync(int id)
{
   return _context.DetailsLookup.Where(x=>x.Id==id).FirstOrDefaultAsync();
}

服务方式:

public async Task<StudentViewModel> GetStudentViewModelAsync(int id)
{
   var model = new StudentViewModel();

   try
   {
       var student = await _repository.FetchStudentByIdAsync(id);
       if(student != null) 
       {
           var detail = await _repository.FetchDetailByIdAsync(student.GenderId);

           model.Id = student.Id,
           model.Name = student.Name,
           model.GenderId = student.GenderId
           model.GenderName = detail?.Name
       }
   }
   catch(Exception e)
   {
   }

   return model;
}

正如您在那篇文章中所读到的,如果您不 return 自定义视图模型,如何对表和来自多个表的 return 数据执行联接?
更好的方法是使用对数据库的单个调用直接从 repo 连接表和 return 自定义视图模型。当您需要包含详细信息的学生列表时,这是更好的性能。

public async Task<StudentViewModel> FetchStudentViewModelAsync(int id)
{
    return await (from s in _context.Student
                 join d in _context.DetailsLookup on s.GenderId equals d.Id
                 where s.Id == id
                 select new StudentViewModel
                 {
                     Id = s.Id,
                     Name = s.Name,
                     GenderId = s.GenderId
                     GenderName = d.Name
                 }).FirstOrDefaultAsync()
}