创建服务

在创建服务之前,我们需要清楚我们要做什么。

至少要知道这个服务要做什么,需要接收什么参数,做什么处理,返回什么数据。

因此我们简单叙述服务要做的事情:

  1. 接收查询视图模型SearchViewModel;
  2. 将视图模型中的6个查询条件传递给仓库类;
  3. 获取仓库类返回的学生模型列表;
  4. 将学生模型列表转换为学生视图模型列表,并将值赋给Results属性;
  5. 获取专业下拉列表,并赋值给Majors;
  6. 获取年级下拉列表,并赋值给Grades;
  7. 返回模型;

于是,我们可以按照这样一个思路先想服务创建出来。

创建SearchService

在Services文件夹下创建SearchService服务类文件。

注入StudentRepo,MajorRepo,GradeRepo实例。

创建GetList方法。

代码如下:

public class SearchService(StudentRepo studentRepo, MajorRepo majorRepo, GradeRepo gradeRepo)
{
    public SearchViewModel GetList(SearchViewModel model)
    {
        List<Student> students = studentRepo.GetList(model.MajorId, model.GradeId, model.ClassId, model.Gender, model.Name, model.Number);
        foreach (var student in students)
        {
            model.Results.Add(new ResultViewModel()
            {
                MajorName = student.Class.Major.Name,
                GradeName = student.Class.Grade.Name,
                ClassName = student.Class.Name,
                Number = student.Number,
                Name = student.Name,
                Gender = student.Gender,
                Birthday = student.Birthday
            });
        }

        List<Major> majors = majorRepo.GetList();
        model.Majors = new SelectList(majors, "Id", "Name");

        List<Grade> grades = gradeRepo.GetList();
        model.Grades = new SelectList(grades, "Id", "Name");

        return model;
    }
}

最后将SearchService注册为服务。

services.AddScoped<SearchService>();

这样写完程序会报错,StudentRepo中并不存在这种参数的GetList方法,因此我们需要在StudentRepo中创建一个新的GetList方法。

创建GetList方法

在StudentRepo中创建一个新的GetList方法。

这个方法接收6个参数,并且均可为空。

如果某参数为空,则这一项就不筛选。

最终代码如下:

public List<Student> GetList(Guid? majorId, Guid? gradeId, Guid? classId, bool? gender, string? name, string? number)
{
    IQueryable<Student> query = DbSet.AsQueryable();
    query = query.Include(s => s.Class).ThenInclude(c => c.Major).Include(s => s.Class).ThenInclude(c => c.Grade);
    if (majorId != null)
    {
        query = query.Where(s => s.Class.MajorId.Equals(majorId));
    }
    if (gradeId != null)
    {
        query = query.Where(s => s.Class.GradeId.Equals(gradeId));
    }
    if (classId != null)
    {
        query = query.Where(s => s.ClassId.Equals(classId));
    }
    if (gender != null)
    {
        query = query.Where(s => s.Gender.Equals(gender));
    }
    if (name != null)
    {
        query = query.Where(s => s.Name.Contains(name));
    }
    if (number != null)
    {
        query = query.Where(s => s.Number.Equals(number));
    }
    return query.ToList();
}

其中Where(s => s.Name.Contains(name))是一个模糊查询,只要名字包含输入的字符,就将此数据筛选出来。