Warm tip: This article is reproduced from serverfault.com, please click

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

(c# - Using Repository Pattern for two tables without relation)

发布于 2020-12-01 15:06:31

如何在C#中使用存储库模式从两个表中获取数据,而无需在数据库中建立两个表之间的关系?例如,我有一个学生用的桌子和一个详细信息的桌子:

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;}
}

我为GenderIdfrom设置了数据,DetailsLookup.Id但是它没有在数据库中创建它们之间的关系。

我在代码和工作单元中使用存储库模式。我有个主意要回来StudentViewModel

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

但是根据我在这里阅读的内容,我们无法从存储库返回视图模型/ DTO。

有人可以帮我弄这个吗?

Questioner
pesito
Viewed
11
Pirate 2020-12-01 23:45:53

如果你担心要从存储库中返回视图模型,请分别获取记录并将其合并到服务层中。

存储库方法:

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;
}

如你在该文章中所读,如果不返回自定义viewmodel,如何在表上执行联接并从多个表返回数据?
更好的方法是连接表并使用对数据库的一次调用直接从回购中返回自定义视图模型。当你需要带有详细信息的学生列表时,这会带来更好的性能。

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()
}