Разработка базовых запросов

Для работы с таблицами базы данных разработано ряд функций, которые делятся на те, которые:

- добавляют записи (create). Возвращает id новой записи;

- читают таблицы (details). Возвращает результат запроса;

- изменяют запись в таблице (edit). Возвращает id изменной записи;

- удаляет запись из таблицы (delete). Возвращает id удаленной записи.

 

Функция createв контролере студента– добавляет новую запись в таблицу Person. Входящий параметр – фамилия,имя, дата рождения,телефон и emailстудента. Возвращает id новой записи или ошибку, если добавление не получилось.

// GET: Students/Create

public IActionResult Create()

   {

ViewData["GroupNameID"] = new SelectList(_context.GroupNames, "GroupNameID", "Namegroup");

return View();

   }

 

// POST: Students/Create

// To protect from overposting attacks, please enable the specific properties you want to bind to, for

// more details see http://go.microsoft.com/fwlink/?LinkId=317598.

   [HttpPost]

   [ValidateAntiForgeryToken]

publicasync Task<IActionResult> Create(

       [Bind("PhoneNumber,BornDate,FirstMidName,LastName, Email, GroupNameID")] Student student)

   {

try

       {

if (ModelState.IsValid)

           {

               _context.Add(student);

await _context.SaveChangesAsync();

return RedirectToAction(nameof(Index));

           }

       }

catch (DbUpdateException /* ex */)

       {

//Log the error (uncomment ex variable name and write a log.

ModelState.AddModelError("", "Unable to save changes. " +

"Try again, and if the problem persists " +

"see your system administrator.");

       }

ViewData["GroupNameID"] = new SelectList(_context.GroupNames, "GroupNameID", "Namegroup", student.GroupNameID);

return View(student);

   }

Функция createв контролере группы– добавляет новую запись в таблицу GroupName. Входящие параметры – названиегруппы, названиегруппы. Возвращает название группы.

 

// GET: GroupNames/Create

public IActionResult Create()

{

return View();

   }

 

// POST: GroupNames/Create

// To protect from overposting attacks, please enable the specific properties you want to bind to, for

// more details see http://go.microsoft.com/fwlink/?LinkId=317598.

   [HttpPost]

   [ValidateAntiForgeryToken]

publicasync Task<IActionResult> Create([Bind("GroupNameID,Namegroup")] GroupName groupName)

   {

if (ModelState.IsValid)

       {

           _context.Add(groupName);

await _context.SaveChangesAsync();

return RedirectToAction(nameof(Index));

}

return View(groupName);

   }

Функция createв контролере кафедры – добавляет новую запись в таблицу Kafedra. Входящий параметр – idкафедры, название, ученная степень преподователя, ФИО преподователя. Возвращает имя новой записи или ошиьку, если добавление не получилось.

 

// GET: kafedras/Create

public IActionResult Create()

   {

ViewData["PrepodID"] = new SelectList(_context.Prepods, "ID", "FullName");

return View();

   }

 

// POST: kafedras/Create

// To protect from overposting attacks, please enable the specific properties you want to bind to, for

// more details see http://go.microsoft.com/fwlink/?LinkId=317598.

   [HttpPost]

   [ValidateAntiForgeryToken]

publicasync Task<IActionResult> Create([Bind("KafedraID, Name, SuperSadist, PrepodID,RowVersion")] Kafedra kafedra)

{

if (ModelState.IsValid)

       {

           _context.Add(kafedra);

await _context.SaveChangesAsync();

return RedirectToAction(nameof(Index));

       }

ViewData["PrepodID"] = new SelectList(_context.Prepods, "ID", "FullName", kafedra.PrepodID);

return View(kafedra);

   }

Функция createв контролере преподавателя– добавляет новую запись в таблицу Person. Входящий параметр – ФИО, дата рождения, кафедра преподавателя. Возвращает имя новой записи или ошибку, если добавление не получилось.

 

{

var prepod = new Prepod

       {

           Predmet_Assignments = new List<Predmet_Assignment>()

       };

PopulateAssignedPredmetData(prepod);

return View();

   }

 

// POST: Prepods/Create

   [HttpPost]

   [ValidateAntiForgeryToken]

publicasync Task<IActionResult> Create([Bind("FirstMidName,BornDate,LastName,Office_Assignment")] Prepod prepod, string[] selectedPredmets)

   {

if (selectedPredmets!= null)

       {

           prepod.Predmet_Assignments = new List<Predmet_Assignment>();

foreach (var predmet in selectedPredmets)

           {

var predmetToAdd = new Predmet_Assignment { PrepodID = prepod.ID, PredmetID = int.Parse(predmet) };

               prepod.Predmet_Assignments.Add(predmetToAdd);

           }

       }

if (ModelState.IsValid)

       {

           _context.Add(prepod);

await _context.SaveChangesAsync();

return RedirectToAction(nameof(Index));

       }

PopulateAssignedPredmetData(prepod);

return View(prepod);

}

 

Функция createв контролере предмета– добавляет новую запись в таблицу Predmet. Входящие параметры – idпредмета, кредит, названиекафедры и название предмета. Возвращает название новой записи или ошибку, если добавление не получилось.

// GET: predmets/Create

public IActionResult Create()

   {

PopulateKafedrasDropDownList();

return View();

   }

 

   [HttpPost]

   [ValidateAntiForgeryToken]

publicasync Task<IActionResult> Create([Bind("PredmetID,Credits,KafedraID,Title")] Predmet predmet)

   {

if (ModelState.IsValid)

       {

           _context.Add(predmet);

await _context.SaveChangesAsync();

return RedirectToAction(nameof(Index));

       }

PopulateKafedrasDropDownList(predmet.KafedraID);

return View(predmet);

}

Функция createв контролере оценки – добавляет новую запись в таблицу ball. Входящие параметры – название предмета, названиепреподавателя, который поставилоценку и имя студента, которому поставили оценку. Возвращает название новой записи или ошибку, если добавление не получилось.

 

// GET: Enrollments/Create

public IActionResult Create()

   {

 

ViewData["PredmetID"] = new SelectList(_context.Predmets, "PredmetID", "Title");

ViewData["StudentID"] = new SelectList(_context.Students, "ID", "FullName", "GroupName");

ViewData["PrepodID"] = new SelectList(_context.Prepods, "ID", "FullName");

 

return View();

   }

 

// POST: Enrollments/Create

// To protect from overposting attacks, please enable the specific properties you want to bind to, for

// more details see http://go.microsoft.com/fwlink/?LinkId=317598.

   [HttpPost]

   [ValidateAntiForgeryToken]

publicasync Task<IActionResult> Create([Bind("EnrollmentID,PredmetID,StudentID, PrepodID,Ball")] Enrollment enrollment)

   {

if (ModelState.IsValid)

       {

           _context.Add(enrollment);

await _context.SaveChangesAsync();

return RedirectToAction(nameof(Index));

       }

 

ViewData["PredmetID"] = new SelectList(_context.Predmets, "PredmetID", "Title", enrollment.PredmetID);

ViewData["StudentID"] = new SelectList(_context.Students, "ID", "FullName", enrollment.StudentID);

ViewData["PrepodID"] = new SelectList(_context.Prepods, "ID", "FullName", enrollment.PrepodID);

var conn = _context.Database.GetDbConnection();

await conn.OpenAsync();

using (var command = conn.CreateCommand())

       {

string query = "SELECT AVG(Ball) " +

"From ball where StudentID = " + enrollment.StudentID;

           command.CommandText = query;

           DbDataReader reader = awaitcommand.ExecuteReaderAsync();

if (reader.HasRows)

           {

while (await reader.ReadAsync())

               {

ViewData["AvgBall"] = reader.GetDecimal(0);

               }

           }

       }

return View(enrollment);

}

Функция deleteв контролере оценки – удаляет запись из таблицы. Входящие параметры – название таблицы, из которой нужно удалить запись, id записи, которую необходимо удалить. Возвращает id удаленной записи или ошибку, если удаление не получилось.

 

// GET: Enrollments/Delete/5

publicasync Task<IActionResult> Delete(int? id)

   {

if (id == null)

       {

return NotFound();

       }

 

var enrollment = await _context.Enrollments

          .Include(e => e.Predmet)

          .Include(e => e.Student)

          .Include(e => e.Prepod)

          .SingleOrDefaultAsync(m => m.EnrollmentID == id);

if (enrollment == null)

       {

return NotFound();

       }

 

return View(enrollment);

   }

 

// POST: Enrollments/Delete/5

   [HttpPost, ActionName("Delete")]

   [ValidateAntiForgeryToken]

publicasync Task<IActionResult> DeleteConfirmed(int id)

   {

var enrollment = await _context.Enrollments.SingleOrDefaultAsync(m => m.EnrollmentID == id);

       _context.Enrollments.Remove(enrollment);

await _context.SaveChangesAsync();

return RedirectToAction(nameof(Index));

   }

 

privatebool EnrollmentExists(int id)

{

return _context.Enrollments.Any(e => e.EnrollmentID == id);

}

Функцияindexв контролере оценки – возвращаеттаблицуball. Входящиепараметры – нету.

 

// GET: Enrollments

publicasync Task<IActionResult> Index()

   {

var schoolContext = _context.Enrollments

          .Include(e => e.Predmet)

          .Include(e => e.Student)

          .Include(e => e.Prepod);

 

return View(await schoolContext.ToListAsync());

}

Функция indexв контролерегруппы– возвращает таблицу групп, в которыхучатся студенты. Входящиепараметры – нету.

 

// GET: GroupNames

publicasync Task<IActionResult> Index(string sortOrder,

string currentFilter,

string searchString,

int? page,

int? id)

   {

 

//Сортировка

ViewData["CurrentSort"] = sortOrder;

ViewData["NameSortParm"] = String.IsNullOrEmpty(sortOrder)? "id_desc":"";

ViewData["GroupSortParm"] = sortOrder == "Namegroup"? "Namegroup_desc":"Namegroup";

 

if (searchString!= null)

       {

page = 1;

       }

else

       {

searchString = currentFilter;

       }

 

ViewData["CurrentFilter"] = searchString;

 

var groupnames = from s in _context.GroupNames

select s;

if (!String.IsNullOrEmpty(searchString))

       {

groupnames = groupnames.Where(s => s.Namegroup.Contains(searchString));

       }

switch (sortOrder)

       {

case"Namegroup":

groupnames = groupnames.OrderBy(s => s.Namegroup);

break;

case"Namegroup_desc":

groupnames = groupnames.OrderByDescending(s => s.Namegroup);

break;

default:

groupnames = groupnames.OrderBy(s => s.Namegroup);

break;

       }

 

int pageSize = 30;

return View(await PaginatedList<GroupName>.CreateAsync(groupnames.AsNoTracking(), page?? 1, pageSize));

   }

Функция indexв контролерекафедры– возвращает таблицу Kafedra. Входящиепараметры – нету.

 

// GET: kafedras

publicasync Task<IActionResult> Index()

   {

var schoolContext = _context.Kafedras.Include(d => d.Administrator);

return View(await schoolContext.ToListAsync());

}

Функция indexв контролерепредмета – возвращает таблицу Predmet. Входящиепараметры – нету.

 

// GET: Predmets

publicasync Task<IActionResult> Index()

   {

var predmets= _context.Predmets

          .Include(c => c.Kafedra)

           .AsNoTracking();

return View(await predmets.ToListAsync());

}

Функция indexв контролерепредмета– возвращает таблицу предметов, которые преподают конкретныепреподаватели. Входящийпараметр – нету

 

// GET: Prepods

publicasync Task<IActionResult> Index(int? id, int? predmetID)

   {

var viewModel = new PrepodIndexData

       {

           Prepods = await _context.Prepods

            .Include(i => i.Office_Assignment)

            .Include(i => i.Predmet_Assignments)

              .ThenInclude(i => i.Predmet)

                  .ThenInclude(i => i.Kafedra)

            .OrderBy(i => i.LastName)

                .ToListAsync()

       };

 

if (id!= null)

       {

ViewData["PrepodID"] = id.Value;

           Prepod prepod = viewModel.Prepods.Where(

i => i.ID == id.Value).Single();

           viewModel.Predmets = prepod.Predmet_Assignments.Select(s => s.Predmet);

       }

 

if (predmetID!= null)

       {

ViewData["PredmetID"] = predmetID.Value;

var selectedPredmet = viewModel.Predmets.Where(x => x.PredmetID == predmetID).Single();

await _context.Entry(selectedPredmet).Collection(x => x.Enrollments).LoadAsync();

foreach (Enrollment enrollment in selectedPredmet.Enrollments)

           {

await _context.Entry(enrollment).Reference(x => x.Student).LoadAsync();

           }

           viewModel.Enrollments = selectedPredmet.Enrollments;

       }

 

return View(viewModel);

}

Функция indexв контролерестудентов– возвращает таблицу студентов, которые учатся в университете. Входящийпараметр – нету.

 

// GET: Students

publicasync Task<IActionResult> Index(

string sortOrder,

string currentFilter,

string searchString,

int? page,

int? id,

string Namegroup)

   {

 

 

//Сортировка

ViewData["CurrentSort"] = sortOrder;

ViewData["NameSortParm"] = String.IsNullOrEmpty(sortOrder)? "name_desc":"";

ViewData["GroupSortParm"] = sortOrder == "Namegroup"? "group_desc":"Namegroup";

 

if (searchString!= null)

       {

page = 1;

       }

else

       {

searchString = currentFilter;

       }

 

ViewData["CurrentFilter"] = searchString;

 

var students = from s in _context.Students

select s;

if (!String.IsNullOrEmpty(searchString))

       {

students = students.Where(s => s.LastName.Contains(searchString)

                                  || s.FirstMidName.Contains(searchString));

       }

switch (sortOrder)

       {

case"name_desc":

students = students.OrderByDescending(s => s.LastName);

break;

case"Namegroup":

students = students.OrderBy(s => s.GroupName.Namegroup);

break;

case"group_desc":

students = students.OrderByDescending(s => s.GroupName.Namegroup);

break;

default:

students = students.OrderBy(s => s.LastName);

break;

       }

int pageSize = 30;

return View(await PaginatedList<Student>.CreateAsync(students

         .Include (s => s.GroupName)

         .AsNoTracking(), page?? 1, pageSize));          

   }

 

// GET: Students/Details/5

publicasync Task<IActionResult> Details(int? id)

   {

if (id == null)

        {

return NotFound();

       }

var student = await _context.Students

          .Include (s => s.GroupName)

          .Include(s => s.Enrollments)

              .ThenInclude(e => e.Predmet)            

          .AsNoTracking()

          .SingleOrDefaultAsync(m => m.ID == id);

 

if (student == null)

       {

return NotFound();

}

 

return View(student);

   }

Функция editв контролере студента – изменяет все, записи о студенте. Входящие параметры – id студента, новое название того что хотим изменить. Возвращаетidживотногоилиошибку, еслизаменанеудалась.

 

// GET: Students/Edit/5

publicasync Task<IActionResult> Edit(int? id)

   {

if (id == null)

       {

return NotFound();

       }

 

var student = await _context.Students

          .AsNoTracking()

          .SingleOrDefaultAsync(m => m.ID == id);

if (student == null)

       {

return NotFound();

       }

ViewData["GroupNameID"] = new SelectList(_context.GroupNames,"GroupNameID", "Namegroup", student.GroupNameID);

return View(student);

   }

 

// POST: Students/Edit/5

// To protect from overposting attacks, please enable the specific properties you want to bind to, for

// more details see http://go.microsoft.com/fwlink/?LinkId=317598.

   [HttpPost, ActionName("Edit")]

   [ValidateAntiForgeryToken]

publicasync Task<IActionResult> EditPost(int? id)

   {

if (id == null)

       {

return NotFound();

       }

var studentToUpdate = await _context.Students

          .SingleOrDefaultAsync(s => s.ID == id);

 

if (await TryUpdateModelAsync<Student>(

studentToUpdate, "",

s => s.FirstMidName, s => s.LastName, s => s.BornDate, s => s.PhoneNumber, s => s.Email, s => s.GroupNameID))

       {

try

           {

await _context.SaveChangesAsync();                

           }

catch (DbUpdateException /* ex */)

           {

//Log the error (uncomment ex variable name and write a log.)

ModelState.AddModelError("", "Не удалось сохранить изменения. " +

"Повторите попытку, и если проблема не исчезнет." +

"обратитесь к системному администратору.");

}

returnRedirectToAction(nameof(Index));

}

ViewData["GroupNameID"] = new SelectList(_context.GroupNames, "GroupNameID", "Namegroup", studentToUpdate.GroupNameID);

return View(studentToUpdate);

   }

Функция editв контролере преподавателя– изменяет все записи о преподавателе. Входящие параметры – id записи. Возвращает id измененной записи.

 

// GET: Prepods/Edit/5

publicasync Task<IActionResult> Edit(int? id)

   {

if (id == null)

       {

return NotFound();

       }

 

var prepod = await _context.Prepods

          .Include(i => i.Office_Assignment)

          .Include(i => i.Predmet_Assignments).ThenInclude(i => i.Predmet)

          .AsNoTracking()

          .SingleOrDefaultAsync(m => m.ID == id);

if (prepod == null)

       {

return NotFound();

       }

PopulateAssignedPredmetData(prepod);

return View(prepod);

   }

 

privatevoid PopulateAssignedPredmetData(Prepod prepod)

   {

var allPredmets = _context.Predmets;

var prepodPredmet = new HashSet<int>(prepod.Predmet_Assignments.Select(c => c.PredmetID));

var viewModel = new List<AssignedPredmetData>();

foreach (var predmet in allPredmets)

       {

viewModel.Add(new AssignedPredmetData

           {

               PredmetID = predmet.PredmetID,

               Title = predmet.Title,

               Assigned = prepodPredmet.Contains(predmet.PredmetID)

});

       }

       ViewData["Predmets"] = viewModel;

   }

Функцияeditв контролере кафедры– изменяетназваниекафедры. Входящие параметры – id кафедры, новое название кафедры. Возвращаетidкафедрыилиошибку, еслизаменанеудалась.

// GET: kafedras/Edit/5

publicasync Task<IActionResult> Edit(int? id)

   {

if (id == null)

       {

return NotFound();

}

 

var kafedra = await _context.Kafedras

          .Include(i => i.Administrator)

          .AsNoTracking()

          .SingleOrDefaultAsync(m => m.KafedraID == id);

 

if (kafedra == null)

       {

return NotFound();

       }

ViewData["kafedraID"] = new SelectList(_context.Prepods, "ID", "FullName", kafedra.PrepodID);

return View(kafedra);

   }

Функцияeditв контролере группы– изменяет код иназваниегруппы. Входящие параметры – id группы, новое название группы. Возвращаетidгруппыилиошибку, еслизаменанеудалась.

 

// GET: GroupNames/Edit/5

publicasync Task<IActionResult> Edit(int? id)

   {

if (id == null)

       {

return NotFound();

       }

 

var groupName = await _context.GroupNames.SingleOrDefaultAsync(m => m.GroupNameID == id);

if (groupName == null)

       {

return NotFound();

}

return View(groupName);

   }

 

// POST: GroupNames/Edit/5

// To protect from overposting attacks, please enable the specific properties you want to bind to, for

// more details see http://go.microsoft.com/fwlink/?LinkId=317598.

   [HttpPost]

     [ValidateAntiForgeryToken]

publicasync Task<IActionResult> Edit(int id, [Bind("GroupNameID,Namegroup")] GroupName groupName)

   {

if (id!= groupName.GroupNameID)

       {

return NotFound();

       }

 

if (ModelState.IsValid)

       {

try

           {

               _context.Update(groupName);

await _context.SaveChangesAsync();

           }

catch (DbUpdateConcurrencyException)

           {

if (!GroupNameExists(groupName.GroupNameID))

               {

return NotFound();

               }

else

               {

throw;

               }

           }

return RedirectToAction(nameof(Index));

}

return View(groupName);

   }

Функция editв контролере оценки– изменяет оценку, кто и кому поставили. Входящие параметры – id предмета, id студента. Возвращаетidоценкиилиошибку, еслизаменанеудалась.

 

// GET: Enrollments/Edit/5

publicasync Task<IActionResult> Edit(int? id)

   {

if (id == null)

       {

return NotFound();

       }

 

var enrollment = await _context.Enrollments

          .Include (e => e.PredmetID)

          .Include (e => e.StudentID)

          .Include (e => e.PrepodID)

          .SingleOrDefaultAsync(m => m.EnrollmentID == id);

 

if (enrollment == null)

       {

return NotFound();

       }

ViewData["PredmetID"] = new SelectList(_context.Predmets, "PredmetID", "Title", enrollment.PredmetID);

ViewData["StudentID"] = new SelectList(_context.Students, "ID", "FullName", enrollment.StudentID);

ViewData["PrepodID"] = new SelectList(_context.Prepods, "ID", "FullName", enrollment.PrepodID);

return View(enrollment);

   }

 

// POST: Enrollments/Edit/5

// To protect from overposting attacks, please enable the specific properties you want to bind to, for

// more details see http://go.microsoft.com/fwlink/?LinkId=317598.

   [HttpPost]

   [ValidateAntiForgeryToken]

publicasync Task<IActionResult> Edit(int id, [Bind("EnrollmentID,PredmetID,StudentID,PrepodID,Ball")] Enrollment enrollment)

   {

if (id!= enrollment.EnrollmentID)

       {

return NotFound();

       }

 

if (ModelState.IsValid)

       {

try

           {

               _context.Update(enrollment);

await _context.SaveChangesAsync();

           }

catch (DbUpdateConcurrencyException)

           {

if (!EnrollmentExists(enrollment.EnrollmentID))

               {

return NotFound();

               }

else

               {

throw;

               }

           }

return RedirectToAction(nameof(Index));

       }

ViewData["PredmetID"] = new SelectList(_context.Predmets, "PredmetID", "Title", enrollment.PredmetID);

ViewData["StudentID"] = new SelectList(_context.Students, "ID", "FullName", enrollment.StudentID);

ViewData["PrepodID"] = new SelectList(_context.Prepods, "ID", "FullName", enrollment.PrepodID);

return View(enrollment);

   }

Функцияeditв контролере предмета– изменяетназваниепредмета, кредаты. Входящие параметры – id предмета. Возвращаетidпредметаили ошибку, еслизаменанеудалась.

 

[HttpPost, ActionName("Edit")]

[ValidateAntiForgeryToken]

publicasync Task<IActionResult> EditPost(int? id)

   {

if (id == null)

       {

return NotFound();

       }

 

var predmetToUpdate = await _context.Predmets

          .SingleOrDefaultAsync(c => c.PredmetID == id);

 

if (await TryUpdateModelAsync<Predmet>(predmetToUpdate,

"",

c => c.Credits, c => c.KafedraID, c => c.Title))

       {

try

           {

await _context.SaveChangesAsync();

           }

catch (DbUpdateException /* ex */)

           {

//Log the error (uncomment ex variable name and write a log.)

ModelState.AddModelError("", "Не удалось сохранить изменения. " +

"Повторите попытку, и если проблема не исчезнет." +

"обратитесь к системному администратору.");

}

returnRedirectToAction(nameof(Index));

}

PopulateKafedrasDropDownList(predmetToUpdate.KafedraID);

return View(predmetToUpdate);

   }

 

privatevoid PopulateKafedrasDropDownList(object selectedKafedra = null)

   {

var kafedraQuery = from d in _context.Kafedras

orderby d.Name

select d;

       ViewBag.KafedraID = newSelectList(kafedraQuery.AsNoTracking(), "KafedraID", "Name", selectedKafedra);

}

 

Функция список студентов по среднему баллу. Входящие параметры – балл, ФИО студента. Возвращает таблицу с средним баллом, с указанием фамилии, имени студента, среднего балла. Таблица сортируется по среднему баллу в порядке возрастания.

 

publicasyncTask<ActionResult>Srball()

{

       List<SrBall> srballs = new List<SrBall>();

var conn = _context.Database.GetDbConnection(); 

try

       {

await conn.OpenAsync();

using (var command = conn.CreateCommand())

           {

string query = "SELECT AVG(Ball), LastName, FirstName " +

"From ball, person " +

"Where StudentID = ID " +

"Group by StudentID " +

"Order by avg(Ball)asc";

               command.CommandText = query;

               DbDataReader reader = awaitcommand.ExecuteReaderAsync();

if (reader.HasRows)

               {

while (await reader.ReadAsync())

                   {

var row = new SrBall { Ball = reader.GetDecimal(0), LastName = reader.GetString(1), FirstMidName = reader.GetString(2) };

srballs.Add(row);

                   }

               }

reader.Dispose();

           }

       }

finally

       {

conn.Close();

       }         

return View(srballs);

}

 




double arrow
Сейчас читают про: