我正在使用MVC 5和EF6开发应用程序。我正在关注Repository设计模式。像往常一样,有一个Generic Repository层,它有一个类型参数GenericRepository<'T'>。存储库包含GetAll函数:
public virtual List<T> GetAll()
{
IQueryable<T> query = _entities.Set<T>();
return query.ToList();
}
已从服务层调用此存储库。在服务层中还有一个名为GetAll()的函数。功能如下:
public List<Student> GetAll()
{
return _unitOfWork.StudentRepository.GetAll();
}
存储库一次处理单个实体。在这个例子中,我只从Student表中检索数据。我的问题是,如果我想从多个表中检索数据,比如学生部门和国家/地区并在视图中显示它,它怎么可能?我的控制器代码如下:
public ActionResult Index()
{
return View(student.GetAll());
}
我应该如何以及在何处加入“位置”和“州”实体。我还有一个UnitOfWork层。该层就像:
public class UnitOfWork : IUnitOfWork
{
private readonly ConnString _context;
private IGenericRepository<Student> studentRepository;
private IGenericRepository<Department> departmentRepository;
private IGenericRepository<Country> countryRepository;
public UnitOfWork()
{
this._context = new ConnString();
}
public IGenericRepository<Student> StudentRepository
{
get { return this.studentRepository ?? (this.studentRepository = new GenericRepository<Student>(_context)); }
}
另一个问题是,如果我想在视图中生成下拉列表(例如,部门和国家/地区),我该怎么做?
感谢接受任何帮助。
由于 帕塔
答案 0 :(得分:0)
首先。存储库模式不包装表。它包装域实体。它们可能存储也可能不存储在单个表中。
对于您的场景,控制器工作是从模型(业务层)获取信息并使其适应视图的要求。
因此我会做这样的事情:
var students = _studentRepos.GetStudentsInSchool(schoolId);
var departmentIds = students.Select(x=>x.DepartmentId).Distinct();
var departments = _departmentRepos.GetAll(departmentIdS);
var countryIds = studens.Select(x=>x.CountryId).Distinct();
var countries = _countryRepos.GetAll(countryIds);
var items = new List<StudentSummaryModel>();
foreach (var student in studens)
{
var item = new StudentSummaryModel(student);
item.CountryName = countries.First(x=>x.Id == student.CountryId).Name;
item.DepartmentName = departments.First(x=>x.Id == student.DepartmentId).Name;
items.Add(item)
}
return View(items);
代码合理易读,不同的业务领域是分开的。