Методические указания по выполнению лабораторных работ по курсу РИП (1071214), страница 2
Текст из файла (страница 2)
Программа должна быть разработана в виде консольного приложения наязыке C#.2. Создайте класс «Сотрудник», содержащий поля: ID записи о сотруднике; Фамилия сотрудника; ID записи об отделе.3. Создайте класс «Отдел», содержащий поля: ID записи об отделе; Наименование отдела.4. Предполагая, что «Отдел» и «Сотрудник» связаны соотношением один-комногим, разработайте следующие запросы: Выведите список всех сотрудников и отделов, отсортированный поотделам. Выведите список всех сотрудников, у которых фамилия начинается сбуквы «А».8 Выведите список всех отделов и количество сотрудников в каждомотделе. Выведите список отделов, в которых у всех сотрудников фамилияначинается с буквы «А». Выведите список отделов, в которых хотя бы у одного сотрудникафамилия начинается с буквы «А».5. Создайте класс «Сотрудники отдела», содержащий поля: ID записи о сотруднике; ID записи об отделе.6.
Предполагая, что «Отдел» и «Сотрудник» связаны соотношением много-комногим с использованием класса «Сотрудники отдела» разработайтезапросы, указанные в пункте 4.6.4 Лабораторная работа 4Разработать программу, реализующую обработку данных с использованиембиблиотеки LINQ to Entities.1. Программа должна быть разработана в виде консольного приложения наязыке C#.2. Используя условия лабораторной работы №3, создайте модель EntityFramework (на основе SQL Server) и разработайте запросы, указанные влабораторной работе №3.3. Рекомендуется разработать две различные модели для случаев один-комногим и много-ко-многим.6.5 Лабораторная работа 5Создание проекта ASP.NET MVC с использованием механизма «scaffolding».1.
Создайте модель Entity Framework, содержащую две сущности, связанныесоотношением один-ко-многим.92. Заполните модель тестовыми данными с использованием программы наязыке C# (возможно использованием отдельного проекта C# иликонтроллера ASP.NET MVC).3. С использованием стандартного механизма «scaffolding» сгенерируйте помодели макет приложения ASP.NET MVC, позволяющий добавлять,редактировать и удалять данные.4.
Создайте контроллер и вид, формирующий выборку данных из моделиданных Entity Framework в виде HTML-таблицы с использованиемтехнологии LINQ to Entities.6.6 Лабораторная работа 6Обработка динамических данных с использованием технологии ASP.NETWeb API.1. С использованием контроллера ASP.NET Web API реализуйте работающийиндикатор процесса Twitter Bootstrap, который отрабатывает за заданноечисло секунд (может быть задано в виде константы или вводитьсяпользователем).2. Создайте контроллер ASP.NET Web API, генерирующий случайные числа(данные графика). С использованием JavaScript реализуйте динамическоеобновление данных графика в окне браузера. Для реализации AJAX-запросов к серверу может быть использованабиблиотека jQuery. Для отображения графика может быть использована произвольнаябиблиотека на JavaScript, например http://dygraphs.com/107 Вспомогательныематериалыдлявыполнениялабораторных работ7.1 Лабораторная работа 1При разработке макета сайта можно использовать любые справочныематериалы по языку разметки HTML.
В качестве справочника может бытьиспользован сайт http://htmlbook.ru/7.2 Лабораторная работа 2Библиотека Twitter Bootstrap является библиотекой с открытым исходнымкодом. Официальный сайт Twitter Bootstrap http://getbootstrap.com/Следует учитывать, что библиотека довольно быстро изменяется. Многиепримеры, которыеприведенына русскоязычныхсайтах, втомчислеhttp://mybootstrap.ru/ к сожалению, не работают в последних версиях библиотеки.Все примеры рекомендуется брать именно с официального сайта.Также может представлять интерес сайт с расширениями (дополнительнымистилями, компонентами и т.д.) для Twitter Bootstrap http://bootsnipp.com/resources7.3 Лабораторная работа 37.3.1 Фрагментпрограммы,реализующейобработкуданныхсиспользованием библиотеки LINQ to ObjectsusingusingusingusingSystem;System.Collections.Generic;System.Linq;System.Text;namespace SimpleLINQ{class Program{/// <summary>/// Класс данных/// </summary>public class Data{/// <summary>/// Ключ/// </summary>11public int id;/// <summary>/// Для группировки/// </summary>public string grp;/// <summary>/// Значение/// </summary>public string value;/// <summary>/// Конструктор/// </summary>public Data(int i, string g, string v){this.id = i;this.grp = g;this.value = v;}/// <summary>/// Приведение к строке/// </summary>public override string ToString(){return "(id=" + this.id.ToString() + "; grp=" + this.grp + "; value=" +this.value + ")";}}/// <summary>/// Класс для сравнения данных/// </summary>public class DataEqualityComparer : IEqualityComparer<Data>{public bool Equals(Data x, Data y){bool Result = false;if (x.id == y.id && x.grp == y.grp && x.value == y.value) Result = true;return Result;}public int GetHashCode(Data obj){return obj.id;}}/// <summary>/// Связь между списками/// </summary>public class DataLink{public int d1;public int d2;public DataLink(int i1, int i2){this.d1 = i1;this.d2 = i2;}}12//Пример данныхstatic List<Data> d1 = new List<Data>(){new Data(1, "group1", "11"),new Data(2, "group1", "12"),new Data(3, "group2", "13"),new Data(5, "group2", "15")};static List<Data> d2 = new List<Data>(){new Data(1, "group2", "21"),new Data(2, "group3", "221"),new Data(2, "group3", "222"),new Data(4, "group3", "24")};static List<Data> d1_for_distinct = new List<Data>(){new Data(1, "group1", "11"),new Data(1, "group1", "11"),new Data(1, "group1", "11"),new Data(2, "group1", "12"),new Data(2, "group1", "12")};static List<DataLink> lnk = new List<DataLink>(){new DataLink(1,1),new DataLink(1,2),new DataLink(1,4),new DataLink(2,1),new DataLink(2,2),new DataLink(2,4),new DataLink(5,1),new DataLink(5,2)};static void Main(string[] args){Console.WriteLine("Простая выборка элементов");var q1 = from x in d1 select x;foreach (var x in q1) Console.WriteLine(x);//++++++++++++++++++++++++++++++++++++++++++++++++++Console.WriteLine("Выборка отдельного поля (проекция)");var q2 = from x in d1 select x.value;foreach (var x in q2) Console.WriteLine(x);//++++++++++++++++++++++++++++++++++++++++++++++++++Console.WriteLine("Создание нового объекта анонимного типа");var q3 = from x in d1select new { IDENTIFIER = x.id, VALUE = x.value };foreach (var x in q3) Console.WriteLine(x);//++++++++++++++++++++++++++++++++++++++++++++++++++//++++++++++++++++++++++++++++++++++++++++++++++++++//++++++++++++++++++++++++++++++++++++++++++++++++++Console.WriteLine("Условия");13var q4 = from x in d1where x.id > 1 && (x.grp=="group1" || x.grp=="group2")select x;foreach (var x in q4) Console.WriteLine(x);//++++++++++++++++++++++++++++++++++++++++++++++++++Console.WriteLine("Выборка по значению типа");object[] array = new object[] {123, "строка 1", true, "строка 2"};var qo = from x in array.OfType<string>()select x;foreach (var x in qo) Console.WriteLine(x);//++++++++++++++++++++++++++++++++++++++++++++++++++//++++++++++++++++++++++++++++++++++++++++++++++++++//++++++++++++++++++++++++++++++++++++++++++++++++++Console.WriteLine("Сортировка");var q5 = from x in d1where x.id > 1 && (x.grp == "group1" || x.grp == "group2")orderby x.grp descending, x.id descendingselect x;foreach (var x in q5) Console.WriteLine(x);//++++++++++++++++++++++++++++++++++++++++++++++++++Console.WriteLine("Сортировка (с использованием методов)");var q51 = d1.Where((x) =>{ return x.id > 1 && (x.grp == "group1" || x.grp == "group2"); }).OrderByDescending(x => x.grp).ThenByDescending(x => x.id);foreach (var x in q51) Console.WriteLine(x);//++++++++++++++++++++++++++++++++++++++++++++++++++//++++++++++++++++++++++++++++++++++++++++++++++++++//++++++++++++++++++++++++++++++++++++++++++++++++++Console.WriteLine("Partitioning Operators");Console.WriteLine("Постраничная выдача данных");var qp = GetPage(d1, 2, 2);foreach (var x in qp) Console.WriteLine(x);//++++++++++++++++++++++++++++++++++++++++++++++++++Console.WriteLine("Использование SkipWhile и TakeWhile");int[] intArray = new int[] { 1,2,3,4,5,6,7,8 };var qw = intArray.SkipWhile(x => (x < 4)).TakeWhile(x=>x<=7);foreach (var x in qw) Console.WriteLine(x);//++++++++++++++++++++++++++++++++++++++++++++++++++//++++++++++++++++++++++++++++++++++++++++++++++++++//++++++++++++++++++++++++++++++++++++++++++++++++++Console.WriteLine("Декартово произведение");var q6 = from x in d1from y in d2select new { v1 = x.value, v2 = y.value };foreach (var x in q6) Console.WriteLine(x);//++++++++++++++++++++++++++++++++++++++++++++++++++14Console.WriteLine("Inner Join с использованием Where");var q7 = from x in d1from y in d2where x.id == y.idselect new { v1 = x.value, v2 = y.value };foreach (var x in q7) Console.WriteLine(x);//++++++++++++++++++++++++++++++++++++++++++++++++++Console.WriteLine("Cross Join (Inner Join) с использованием Join");var q8 = from x in d1join y in d2 on x.id equals y.idselect new { v1 = x.value, v2 = y.value };foreach (var x in q8) Console.WriteLine(x);//++++++++++++++++++++++++++++++++++++++++++++++++++Console.WriteLine("Cross Join (сохранение объекта)");var q9 = from x in d1join y in d2 on x.id equals y.idselect new { v1 = x.value, d2Group = y };foreach (var x in q9) Console.WriteLine(x);//++++++++++++++++++++++++++++++++++++++++++++++++++//Выбираются все элементы из d1 и если есть связанные из d2 (outer join)//В temp помещается вся группа, ее элементы можно перебирать отдельноConsole.WriteLine("Group Join");var q10 = from x in d1join y in d2 on x.id equals y.id into tempselect new { v1 = x.value, d2Group = temp };foreach (var x in q10){Console.WriteLine(x.v1);foreach(var y in x.d2Group)Console.WriteLine("" + y);}//++++++++++++++++++++++++++++++++++++++++++++++++++Console.WriteLine("Cross Join и Group Join");var q11 = from x in d1join y in d2 on x.id equals y.id into tempfrom t in tempselect new { v1 = x.value, v2 = t.value, cnt = temp.Count() };foreach (var x in q11) Console.WriteLine(x);//++++++++++++++++++++++++++++++++++++++++++++++++++Console.WriteLine("Outer Join");var q12 = from x in d1join y in d2 on x.id equals y.id into tempfrom t in temp.DefaultIfEmpty()select new { v1 = x.value, v2 = ( (t==null) ? "null" : t.value ) };foreach (var x in q12) Console.WriteLine(x);//++++++++++++++++++++++++++++++++++++++++++++++++++Console.WriteLine("Использование Join для составных ключей");var q12_1 = from x in d1join y in d1_for_distinct on new { x.id, x.grp } equals new { y.id, y.grp} into detailsfrom d in details select d;15foreach (var x in q12_1) Console.WriteLine(x);//++++++++++++++++++++++++++++++++++++++++++++++++++//++++++++++++++++++++++++++++++++++++++++++++++++++//++++++++++++++++++++++++++++++++++++++++++++++++++//Действия над множествамиConsole.WriteLine("Distinct - неповторяющиеся значения");var q13 = (from x in d1 select x.grp).Distinct();foreach (var x in q13) Console.WriteLine(x);//++++++++++++++++++++++++++++++++++++++++++++++++++Console.WriteLine("Distinct - повторяющиеся значения для объектов");var q14 = (from x in d1_for_distinct select x).Distinct();foreach (var x in q14) Console.WriteLine(x);//++++++++++++++++++++++++++++++++++++++++++++++++++Console.WriteLine("Distinct - неповторяющиеся значения для объектов");var q15 = (from x in d1_for_distinct select x).Distinct(newDataEqualityComparer());foreach (var x in q15) Console.WriteLine(x);//++++++++++++++++++++++++++++++++++++++++++++++++++Console.WriteLine("Union - объединение с исключением дубликатов");int[] i1 = new int[] { 1, 2, 3, 4 };int[] i1_1 = new int[] { 2, 3, 4, 1 };int[] i2 = new int[] { 2, 3, 4, 5 };foreach (var x in i1.Union(i2)) Console.WriteLine(x);Console.WriteLine("Union - объединение для объектов");foreach (var x in d1.Union(d1_for_distinct)) Console.WriteLine(x);Console.WriteLine("Union - объединение для объектов с исключением дубликатов 1");foreach (var x in d1.Union(d1_for_distinct, new DataEqualityComparer()))Console.WriteLine(x);Console.WriteLine("Union - объединение для объектов с исключением дубликатов 2");foreach (var x in d1.Union(d1_for_distinct).Union(d2).Distinct(newDataEqualityComparer())) Console.WriteLine(x);//++++++++++++++++++++++++++++++++++++++++++++++++++Console.WriteLine("Concat - объединение без исключения дубликатов");foreach (var x in i1.Concat(i2)) Console.WriteLine(x);Console.WriteLine("SequenceEqual - проверка совпадения элементов и порядка ихследования");Console.WriteLine(i1.SequenceEqual(i1));Console.WriteLine(i1.SequenceEqual(i2));//++++++++++++++++++++++++++++++++++++++++++++++++++Console.WriteLine("Intersect - пересечение множеств");foreach (var x in i1.Intersect(i2)) Console.WriteLine(x);Console.WriteLine("Intersect - пересечение множеств для объектов");foreach (var x in d1.Intersect(d1_for_distinct, new DataEqualityComparer()))Console.WriteLine(x);//++++++++++++++++++++++++++++++++++++++++++++++++++16Console.WriteLine("Except - вычитание множеств");foreach (var x in i1.Except(i2)) Console.WriteLine(x);Console.WriteLine("Except - вычитание множеств для объектов");foreach (var x in d1.Except(d1_for_distinct, new DataEqualityComparer()))Console.WriteLine(x);//++++++++++++++++++++++++++++++++++++++++++++++++++//++++++++++++++++++++++++++++++++++++++++++++++++++//++++++++++++++++++++++++++++++++++++++++++++++++++Console.WriteLine("Функции агрегирования");Console.WriteLine("Count - количество элементов");Console.WriteLine(d1.Count());Console.WriteLine("Count с условием");Console.WriteLine(d1.Count(x => x.id > 1));//Могут использоваться также следующие агрегирующие функции//Sum - сумма элементов//Min - минимальный элемент//Max - максимальный элемент//Average - среднее значение//++++++++++++++++++++++++++++++++++++++++++++++++++Console.WriteLine("Aggregate - агрегирование значений");var qa1 = d1.Aggregate(new Data(0,"",""),(total, next) =>{if (next.id > 1) total.id += next.id;return total;});Console.WriteLine(qa1);//++++++++++++++++++++++++++++++++++++++++++++++++++//++++++++++++++++++++++++++++++++++++++++++++++++++//++++++++++++++++++++++++++++++++++++++++++++++++++Console.WriteLine("Группировка");var q16 = from x in d1.Union(d2)group x by x.grp into gselect new { Key = g.Key, Values = g };foreach (var x in q16){Console.WriteLine(x.Key);foreach (var y in x.Values)Console.WriteLine("" + y);}//++++++++++++++++++++++++++++++++++++++++++++++++++Console.WriteLine("Группировка с функциями агрегирования");var q17 = from x in d1.Union(d2)group x by x.grp into gselect new { Key = g.Key, Values = g, cnt = g.Count(), cnt1 =g.Count(x=>x.id>1), sum = g.Sum(x=>x.id), min = g.Min(x=>x.id) };foreach (var x in q17){Console.WriteLine(x);17foreach (var y in x.Values)Console.WriteLine("" + y);}//++++++++++++++++++++++++++++++++++++++++++++++++++Console.WriteLine("Группировка - Any");var q18 = from x in d1.Union(d2)group x by x.grp into gwhere g.Any(x=> x.id > 3)select new { Key = g.Key, Values = g };foreach (var x in q18){Console.WriteLine(x.Key);foreach (var y in x.Values)Console.WriteLine("" + y);}Console.WriteLine("Группировка - All");var q19 = from x in d1.Union(d2)group x by x.grp into gwhere g.All(x => x.id > 1)select new { Key = g.Key, Values = g };foreach (var x in q19){Console.WriteLine(x.Key);foreach (var y in x.Values)Console.WriteLine("" + y);}//++++++++++++++++++++++++++++++++++++++++++++++++++Console.WriteLine("Имитация связи много-ко-многим");var lnk1 = from x in d1join l in lnk on x.id equals l.d1 into tempfrom t1 in tempjoin y in d2 on t1.d2 equals y.id into temp2from t2 in temp2select new { id1 = x.id, id2 = t2.id };foreach (var x in lnk1) Console.WriteLine(x);//++++++++++++++++++++++++++++++++++++++++++++++++++Console.WriteLine("Имитация связи много-ко-многим, проверка условия");var lnk2 = from x in d1join l in lnk on x.id equals l.d1 into tempfrom t1 in tempjoin y in d2 on t1.d2 equals y.id into temp2where temp2.Any(t=>t.value == "24")select x;foreach (var x in lnk2) Console.WriteLine(x);//++++++++++++++++++++++++++++++++++++++++++++++++++Console.WriteLine("Имитация связи много-ко-многим, использование let, проверкаусловия");var lnk3 = from x in d1let temp1 = from l in lnk where l.d1 == x.id select lfrom t1 in temp1let temp2 = from y in d2 where y.id == t1.d2 && y.value == "24"18select ywhere temp2.Count() > 0//let temp2 = from y in d2 where y.id == t1.d2//select y//where temp2.Any(t=>t.value == "24")select x;foreach (var x in lnk3) Console.WriteLine(x);//++++++++++++++++++++++++++++++++++++++++++++++++++//++++++++++++++++++++++++++++++++++++++++++++++++++//++++++++++++++++++++++++++++++++++++++++++++++++++Console.WriteLine("Deferred Execution - отложенное выполнение запроса");var e1 = from x in d1 select x;Console.WriteLine(e1.GetType().Name);foreach (var x in e1) Console.WriteLine(x);Console.WriteLine("При изменении источника данных запрос выдает новыерезультаты");d1.Add(new Data(333, "",""));foreach (var x in e1) Console.WriteLine(x);//++++++++++++++++++++++++++++++++++++++++++++++++++Console.WriteLine("Immediate Execution - немедленное выполнение запроса, результатпреобразуется в список ");var e2 = (from x in d1 select x).ToList();Console.WriteLine(e2.GetType().Name);foreach (var x in e2) Console.WriteLine(x);Console.WriteLine("Результат преобразуется в массив");var e3 = (from x in d1 select x).ToArray();Console.WriteLine(e3.GetType().Name);foreach (var x in e3) Console.WriteLine(x);Console.WriteLine("Результат преобразуется в Dictionary");var e4 = (from x in d1 select x).ToDictionary(x=>x.id);Console.WriteLine(e4.GetType().Name);foreach (var x in e4) Console.WriteLine(x);Console.WriteLine("Результат преобразуется в Lookup");var e5 = (from x in d1_for_distinct select x).ToLookup(x=>x.id);Console.WriteLine(e5.GetType().Name);foreach (var x in e5){Console.WriteLine(x.Key);foreach (var y in x)Console.WriteLine("" + y);}//++++++++++++++++++++++++++++++++++++++++++++++++++//++++++++++++++++++++++++++++++++++++++++++++++++++//++++++++++++++++++++++++++++++++++++++++++++++++++Console.WriteLine("Получение первого элемента из выборки");var f1 = (from x in d2 select x).First(x=>x.id==2);Console.WriteLine(f1);Console.WriteLine("Получение первого элемента или значения по умолчанию");var f2 = (from x in d2 select x).FirstOrDefault(x => x.id == 22);Console.WriteLine(f2==null ? "null" : f2.ToString());19Console.WriteLine("Получение элемента в заданной позиции");var f3 = (from x in d2 select x).ElementAt(2);Console.WriteLine(f3);//++++++++++++++++++++++++++++++++++++++++++++++++++//++++++++++++++++++++++++++++++++++++++++++++++++++//++++++++++++++++++++++++++++++++++++++++++++++++++Console.WriteLine("Генерация последовательностей");Console.WriteLine("Range");foreach (var x in Enumerable.Range(1, 5)) Console.WriteLine(x);Console.WriteLine("Repeat");foreach (var x in Enumerable.Repeat<int>(10,3)) Console.WriteLine(x);Console.ReadLine();}/// <summary>/// Получение нужной страницы данных/// </summary>static List<Data> GetPage(List<Data> data, int pageNum, int pageSize){//Количество пропускаемых элементовint skipSize = (pageNum-1)*pageSize;var q = data.OrderBy(x => x.id).Skip(skipSize).Take(pageSize);return q.ToList();}}}7.4 Лабораторная работа 47.4.1 Диаграмма классов примера модели LINQ to Entities207.4.2 Фрагментпрограммы,реализующейобработкуданныхсиспользованием библиотеки LINQ to EntitiesusingusingusingusingusingSystem;System.Collections.Generic;System.Linq;System.Text;System.Data.Objects;namespace EntityLINQ{class Program{/// <summary>/// Очистка данных/// </summary>static void ClearData(){LearningModelContainer db = new LearningModelContainer();//Удаление данных для связи много-ко-многим//для каждой записи StudentGroup удаляются все связи с Subjectforeach (var gr in db.StudentGroupSet.ToList()){foreach (var gr_subj in gr.Subject.ToList()){gr.Subject.Remove(gr_subj);}}db.SaveChanges();db.StudentGroupSet.ToList().ForEach(db.StudentGroupSet.DeleteObject);db.SaveChanges();db.SubjectSet.ToList().ForEach(db.SubjectSet.DeleteObject);db.SaveChanges();db.SubjectTypeSet.ToList().ForEach(db.SubjectTypeSet.DeleteObject);db.SaveChanges();}/// <summary>/// Заполнение данных/// </summary>static void InitData(){LearningModelContainer db = new LearningModelContainer();//Добавление типов предметовSubjectType st_tech = new SubjectType{TypeName = "технический цикл",ParentSubjectType = null};db.SubjectTypeSet.AddObject(st_tech);SubjectType st_hum = new SubjectType{TypeName = "гуманитарный цикл",ParentSubjectType = null};21SubjectType st1 = new SubjectType{TypeName = "базовые",ParentSubjectType = st_tech};SubjectType st2 = new SubjectType{TypeName = "специальные",ParentSubjectType = st_tech};SubjectType st3 = new SubjectType{TypeName = "исторические",ParentSubjectType = st_hum};SubjectType st3_1 = new SubjectType{TypeName = "новая история",ParentSubjectType = st3};SubjectType st3_2 = new SubjectType{TypeName = "новейшая история",ParentSubjectType = st3};db.SubjectTypeSet.AddObject(st_tech);db.SubjectTypeSet.AddObject(st_hum);db.SubjectTypeSet.AddObject(st1);db.SubjectTypeSet.AddObject(st2);db.SubjectTypeSet.AddObject(st3);db.SubjectTypeSet.AddObject(st3_1);db.SubjectTypeSet.AddObject(st3_2);//Добавление предметовSubject sb1 = new Subject{SubjectName = "математика",Value = 100, //часовSubjectType = st1};Subject sb2 = new Subject{SubjectName = "физика",Value = 80, //часовSubjectType = st1};Subject sb3 = new Subject{SubjectName = "информатика",Value = 120, //часовSubjectType = st2};Subject sb4 = new Subject{SubjectName = "базы данных",Value = 150, //часов22SubjectType = st2};Subject sb5 = new Subject{SubjectName = "сетевые технологии",Value = 170, //часовSubjectType = st2};db.SubjectSet.AddObject(sb1);db.SubjectSet.AddObject(sb2);db.SubjectSet.AddObject(sb3);db.SubjectSet.AddObject(sb4);db.SubjectSet.AddObject(sb5);//Добавление группStudentGroup g1 = new StudentGroup{GroupName = "ИУ5-11"};StudentGroup g2 = new StudentGroup{GroupName = "ИУ5-51"};StudentGroupSpecial g3 = new StudentGroupSpecial{GroupName = "ИУ5c-11",Flag = true};db.StudentGroupSet.AddObject(g1);db.StudentGroupSet.AddObject(g2);db.StudentGroupSet.AddObject(g3);//Установка связи много-ко многимg1.Subject.Add(sb1);g1.Subject.Add(sb2);g2.Subject.Add(sb3);g2.Subject.Add(sb4);g2.Subject.Add(sb5);g3.Subject.Add(sb1);g3.Subject.Add(sb2);g3.Subject.Add(sb4);//Сохранение данных в БДdb.SaveChanges();}/// <summary>/// Примеры запросов/// </summary>static void Queries(){//Выдача иерархии типов пердметовWriteSubjectTypeTree(-1, 0);Console.WriteLine();23LearningModelContainer db = new LearningModelContainer();//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++Console.WriteLine("Получение всех курсов и групп, которым они читаются");var q1 = from s in db.SubjectSet select s;foreach (var s in q1){Console.WriteLine(s.SubjectName + " (" + s.SubjectType.TypeName + ")");foreach (var g in s.StudentGroup){Console.WriteLine("" + g.GroupName);}}//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++Console.WriteLine("\nКоличество часов по всем предметам для каждой группы");var q2 = from g in db.StudentGroupSetselect new { GroupName = g.GroupName, ValueSum = g.Subject.Sum(x =>x.Value), Subject = g.Subject };foreach (var g in q2){Console.WriteLine(g.GroupName + " (" + g.ValueSum.ToString() + " часов)");foreach (var s in g.Subject){Console.WriteLine("" + s.SubjectName + " (" + s.Value.ToString() + "часов)");}}//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++Console.WriteLine("\nПредметы, читаемые группам");var q3 = from g in db.StudentGroupSetfrom s in g.Subjectselect new { SubjectName = s.SubjectName, Value = s.Value, GroupName =g.GroupName };var q31 = from t in q3orderby t.SubjectName, t.GroupNameselect t;foreach (var g in q31){Console.WriteLine(g);}//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++Console.WriteLine("\nКоличество часов по предмету для всех групп");var q32 = from t in q3group t by t.SubjectName into tempselect new { GroupName = temp.Key, SumValue = temp.Sum(x=>x.Value) };foreach (var g in q32){Console.WriteLine(g);}//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++24Console.WriteLine("\nГруппы для которых читаются специальные курсы (сиспользованием contains)");string[] arr = new string[] { "специальные", "другой" };var qc = from g in db.StudentGroupSetfrom s in g.Subjectwhere arr.Contains(s.SubjectType.TypeName)select new { GroupName = g.GroupName, SubjectTypeName =s.SubjectType.TypeName };foreach (var g in qc){Console.WriteLine(g);}//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++Console.WriteLine("\nТипы курсов, читаемых для группы (с повторяющимисязаписями)");var q4 = from g in db.StudentGroupSetfrom s in g.Subjectselect new { GroupName = g.GroupName, SubjectTypeName =s.SubjectType.TypeName };foreach (var g in q4){Console.WriteLine(g);}//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++Console.WriteLine("\nТипы курсов, читаемых для группы");var q41 = from t in q4.Distinct()select t;foreach (var g in q41){Console.WriteLine(g);}//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++Console.WriteLine("\nГруппы, которым читаются базовые курсы");var q42 = from t in q4.Distinct()where t.SubjectTypeName == "базовые"select t;foreach (var g in q42){Console.WriteLine(g);}//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++Console.WriteLine("\nГруппы, которым читаются базовые курсы (использование any)");var q43 = from t in q4.Distinct()group t by t.GroupName into tempwhere temp.Any((data) => data.SubjectTypeName == "базовые")select temp.Key;foreach (var g in q43)25{Console.WriteLine(g);}//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++Console.WriteLine("\nГруппы, которым читаются только базовые курсы (использованиеall)");var q44 = from t in q4.Distinct()group t by t.GroupName into tempwhere temp.All((data) => data.SubjectTypeName == "базовые")select temp.Key;foreach (var g in q44){Console.WriteLine(g);}Console.WriteLine("\nПолучение сгенерированного SQL");var trace = ((ObjectQuery)q44).ToTraceString();Console.WriteLine(trace);}/// <summary>/// Кэширование данных с использованием Include/// </summary>public static void IncludeExample(){LearningModelContainer db = new LearningModelContainer();//Отключение загрузки связанных данныхdb.ContextOptions.LazyLoadingEnabled = false;Console.WriteLine("\nБез использования Include");var q51 = (from x in db.SubjectSetselect x).ToList();WriteSubjectList(q51);Console.WriteLine("\nС использованием Include");var q52 = (from x in db.SubjectSet.Include("SubjectType").Include("StudentGroup")select x).ToList();WriteSubjectList(q52);}/// <summary>/// Вывод списка/// </summary>/// <param name="list"></param>public static void WriteSubjectList(List<Subject> list){foreach (var x in list){string TypeName = "";if (x.SubjectType != null) TypeName = x.SubjectType.TypeName;else TypeName = "null";Console.WriteLine(x.SubjectName + " (" + TypeName + ")");26if (x.StudentGroup != null){foreach (var y in x.StudentGroup){Console.WriteLine("" + y.GroupName);}}}}public static void WriteSubjectTypeTree(int ParentSubjectTypeParam, int LevelParam){LearningModelContainer db = new LearningModelContainer();var q = from x in db.SubjectTypeSet select x;if (ParentSubjectTypeParam == -1){//Поиск корневых элементов (ParentSubjectType == null)q = q.Where(x => x.SubjectTypeId.HasValue == false);}else{//Поиск элементов с заданным элементом верхнего уровняq = q.Where(x => x.SubjectTypeId.Value == ParentSubjectTypeParam);}//Если существуют элементы на данном уровне иерархииif (q.Count() > 0){//Сортировкаq = q.OrderBy(x => x.TypeName);//Перебор всех значений на заданном уровне иерархииforeach (var x in q){//Вывод отступаif (LevelParam > 0){for (int i = 0; i < LevelParam; i++) Console.Write("}//Вывод значенияConsole.WriteLine(x.TypeName);");//Рекурсивный вызов функции для всех элементов, вложенных в текущийWriteSubjectTypeTree(x.Id, LevelParam + 1);}}}static void Main(string[] args){/*//Заполнение данных в случае пустой БДLearningModelContainer db = new LearningModelContainer();if (db.SubjectTypeSet.Count() == 0){//Инициализация данных для запросовInitData();}*/ClearData();InitData();27Queries();IncludeExample();Console.ReadLine();}}}7.5 Лабораторная работа 57.5.1 Примерконтроллера,сгенерированногосиспользованиемстандартного механизма «scaffolding»usingusingusingusingusingusingusingusingSystem;System.Collections.Generic;System.Data;System.Data.Entity;System.Linq;System.Web;System.Web.Mvc;ReportExample.Models;namespace ReportExample.Controllers{public class ProcessorController : Controller{private Model1Container db = new Model1Container();//// GET: /Processor/public ActionResult Index(){return View(db.Processors.ToList());}//// GET: /Processor/Details/5public ActionResult Details(int id = 0){Processor processor = db.Processors.Single(p => p.Id == id);if (processor == null){return HttpNotFound();}return View(processor);}//// GET: /Processor/Createpublic ActionResult Create(){return View();}//// POST: /Processor/Create[HttpPost]public ActionResult Create(Processor processor)28{if (ModelState.IsValid){db.Processors.AddObject(processor);db.SaveChanges();return RedirectToAction("Index");}return View(processor);}//// GET: /Processor/Edit/5public ActionResult Edit(int id = 0){Processor processor = db.Processors.Single(p => p.Id == id);if (processor == null){return HttpNotFound();}return View(processor);}//// POST: /Processor/Edit/5[HttpPost]public ActionResult Edit(Processor processor){if (ModelState.IsValid){db.Processors.Attach(processor);db.ObjectStateManager.ChangeObjectState(processor, EntityState.Modified);db.SaveChanges();return RedirectToAction("Index");}return View(processor);}//// GET: /Processor/Delete/5public ActionResult Delete(int id = 0){Processor processor = db.Processors.Single(p => p.Id == id);if (processor == null){return HttpNotFound();}return View(processor);}//// POST: /Processor/Delete/5[HttpPost, ActionName("Delete")]public ActionResult DeleteConfirmed(int id){Processor processor = db.Processors.Single(p => p.Id == id);db.Processors.DeleteObject(processor);db.SaveChanges();return RedirectToAction("Index");}29protected override void Dispose(bool disposing){db.Dispose();base.Dispose(disposing);}}}7.5.2 Пример контроллера, используемого для формирования отчетаusingusingusingusingusingSystem;System.Collections.Generic;System.Linq;System.Web;System.Web.Mvc;namespace ReportExample.Controllers{public class SimpleReportController : Controller{//// GET: /SimpleReport/public ActionResult Report(){return View();}}}7.5.3 Пример вида (файл «Report.cshtml»), формирующего выборку данныхиз модели данных Entity Framework в виде HTML-таблицы@using ReportExample.Models@{ViewBag.Title = "Report";Model1Container db = new Model1Container();var q1 = (from x in db.Computersorderby x.HDDselect x).ToList();int sumHDD = q1.Sum(x => x.HDD);}<h2>Жесткие диски компьютеров</h2><table><tr><th>Компьютер</th><th>Емкость жесткого диска</th></tr>@foreach (var x in q1){<tr><td>@x.ComputerName</td><td align="right">@x.HDD</td>30</tr>}<tr><td>ИТОГО</td><td align="right">@sumHDD</td></tr></table>7.6 Лабораторная работа 67.6.1 Пример контроллера ASP.NET Web APIusingusingusingusingusingusingusingusingSystem;System.Collections.Generic;System.Linq;System.Net;System.Net.Http;System.Web.Http;MvcAjax.Helpers;MvcAjax.Models;namespace MvcAjax.Controllers{/// <summary>/// Формат результата/// </summary>public class serverrandomdata{public string x { get; set; }public string y { get; set; }public numbersumdata sumdata { get; set; }}public class ServerRandomController : ApiController{public static List<serverrandomdata> data = new List<serverrandomdata>();static Random random = new Random();// GET api/serverrandompublic List<serverrandomdata> Get(){int i = random.Next(100);//Генерация нового значенияserverrandomdata current = new serverrandomdata(){x = DateTime.Now.ToString(ConstHelper.DateTimeFormat),y = i.ToString(),sumdata = NumberSum.AddNumber(i)};//Добавление в списокdata.Add(current);if (data.Count > 10){data.RemoveRange(0, data.Count - 10);}return data;}31}}7.6.2 Пример вида, реализующего обращение к контроллеру ASP.NET WebAPI@{ViewBag.Title = "Графики";//интервал обновления - 3 сек.int refreshInterval = 3000;string refreshIntervalStr = refreshInterval.ToString();//uri для вызова Web API контроллераstring uri = @"/api/serverrandom";}<h2>Графики</h2><div class="panel panel-primary"><div class="panel-heading">График по 10 последним точкам</div><div class="panel-body"><div id="div_graph_current" style="width:100%; height:333px;"></div></div></div><div class="panel panel-primary"><div class="panel-heading">График по всем точкам</div><div class="panel-body"><div id="div_graph_total" style="width:100%; height:333px;"></div></div></div><div class="panel panel-primary"><div class="panel-heading">График по всем точкам с прокруткой</div><div class="panel-body"><div id="div_graph_total_roll" style="width:100%; height:333px;"></div></div></div>@section Scripts {@Scripts.Render("~/bundles/dygraph")<script type="text/javascript">//-----------------------------------------// Преобразование даты-времени в тип Date из строки//-----------------------------------------function ParseDateTime(dt){var year = dt.substring(0, 4);var month = dt.substring(5, 7);var day = dt.substring(8, 10);var hour = dt.substring(11, 13);var mnt = dt.substring(14, 16);var sec = dt.substring(17, 19);var Result = new Date(year, month-1, day, hour, mnt, sec, 0);return Result;}//Признак первичного заполнения массива с накоплением32var firstTotalFlag = false;//Данные с накоплениемvar dataTotal = [];//Текущие данныеvar dataCurrent = [];//Графикиvar g_current = new Dygraph(document.getElementById("div_graph_current"), dataCurrent,{drawPoints: true,valueRange: [0, 102],labels: ['Время', 'Значение'],'Значение': { fillGraph: true }});var g_total = new Dygraph(document.getElementById("div_graph_total"), dataTotal,{drawPoints: true,valueRange: [0, 102],labels: ['Время', 'Значение'],'Значение': { fillGraph: true }});var g_total_roll = new Dygraph(document.getElementById("div_graph_total_roll"), dataTotal,{drawPoints: true,valueRange: [0, 102],labels: ['Время', 'Значение'],'Значение': { fillGraph: true },colors: ['#3333FF'],showRangeSelector: true});//Uri для доступа к Web API контроллеруvar FullUri = "http://" + window.location.host + '@uri';//Функция setIntervalGraph вызывается после загрузки страницы$(document).bind("ready", setIntervalGraph);function setIntervalGraph(){//Функция RefreshProgress вызывается через заданный интервал времениRefreshGraph();setTimeout(setIntervalGraph, @refreshIntervalStr );}function RefreshGraph(){//Отправка Ajax-запроса о состоянии индикатора прогресса$.ajax({url: FullUri,//функция вызывается после получения ответа на запросsuccess: function (data) {//data - массив данных, полученный с сервера//Очистка массива текущих данныхdataCurrent.length = 0;//Заполнение массива текущих данныхfor (var i = 0; i < data.length; i++){33var element = data[i];var x = ParseDateTime(element.x);var y = element.y;dataCurrent.push([x, y]);}if(!firstTotalFlag){//При первом получении данных в массив с накоплением добавляются вседанныеdataTotal.length = 0;for (var i = 0; i < data.length; i++){var element = data[i];var x = ParseDateTime(element.x);var y = element.y;dataTotal.push([x, y]);}firstTotalFlag = true;}else{//Добавление последнего элемента в массив с накоплениемvar lastElement = data[data.length - 1];var x = ParseDateTime(lastElement.x);var y = lastElement.y;dataTotal.push([x, y]);}//Изменение графиков при изменении массивов данныхg_current.updateOptions({ 'file': dataCurrent });g_total.updateOptions({ 'file': dataTotal });g_total_roll.updateOptions({ 'file': dataTotal });}});}</script>}8 Контрольные вопросы8.1 Лабораторная работа 11.