对两个没有关系的表使用存储库模式
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.Id
为 GenderId
设置了数据,但它并没有在数据库中创建它们之间的关系。
我在我的代码和工作单元中使用存储库模式。我有个想法 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()
}
如何使用 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.Id
为 GenderId
设置了数据,但它并没有在数据库中创建它们之间的关系。
我在我的代码和工作单元中使用存储库模式。我有个想法 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()
}