在创建服务之前,我们需要清楚我们要做什么。
至少要知道这个服务要做什么,需要接收什么参数,做什么处理,返回什么数据。
因此我们简单叙述服务要做的事情:
于是,我们可以按照这样一个思路先想服务创建出来。
在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方法。
在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))
是一个模糊查询,只要名字包含输入的字符,就将此数据筛选出来。