如何在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;}
}
我为GenderId
from设置了数据,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。
有人可以帮我弄这个吗?
如果你担心要从存储库中返回视图模型,请分别获取记录并将其合并到服务层中。
存储库方法:
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()
}
谢谢,所以如果我想返回学生名单,使用函数以viewmodel的形式获取数据并使用联接查询,那是最好的方案,对吗?
@pesito是的,您可以同时使用两种方法。以我的经验,使用联接查询从仓库中返回视图模型更为有效,因为它只会向数据库发出一个请求,并且仅获取需要的字段。而如果您分别获取两个记录并将它们合并到服务中,则将有两个对数据库的调用,并且将提取所有字段。当它是通用的时,从repo返回域是有意义的,但是对于您而言,您需要在SQL中联接两个表,因此您不能通过返回两个域对象来做到这一点。它已先保存到视图模型中,应从回购中返回。