using LinqTutorials.Models; using System; using System.Collections.Generic; using System.Linq; namespace LinqTutorials { public static class LinqTasks { public static IEnumerable Emps { get; set; } public static IEnumerable Depts { get; set; } static LinqTasks() { var empsCol = new List(); var deptsCol = new List(); #region Load depts var d1 = new Dept { Deptno = 1, Dname = "Research", Loc = "Warsaw" }; var d2 = new Dept { Deptno = 2, Dname = "Human Resources", Loc = "New York" }; var d3 = new Dept { Deptno = 3, Dname = "IT", Loc = "Los Angeles" }; deptsCol.Add(d1); deptsCol.Add(d2); deptsCol.Add(d3); Depts = deptsCol; #endregion #region Load emps var e1 = new Emp { Deptno = 1, Empno = 1, Ename = "Jan Kowalski", HireDate = DateTime.Now.AddMonths(-5), Job = "Backend programmer", Mgr = null, Salary = 2000 }; var e2 = new Emp { Deptno = 1, Empno = 20, Ename = "Anna Malewska", HireDate = DateTime.Now.AddMonths(-7), Job = "Frontend programmer", Mgr = e1, Salary = 4000 }; var e3 = new Emp { Deptno = 1, Empno = 2, Ename = "Marcin Korewski", HireDate = DateTime.Now.AddMonths(-3), Job = "Frontend programmer", Mgr = null, Salary = 5000 }; var e4 = new Emp { Deptno = 2, Empno = 3, Ename = "Paweł Latowski", HireDate = DateTime.Now.AddMonths(-2), Job = "Frontend programmer", Mgr = e2, Salary = 5500 }; var e5 = new Emp { Deptno = 2, Empno = 4, Ename = "Michał Kowalski", HireDate = DateTime.Now.AddMonths(-2), Job = "Backend programmer", Mgr = e2, Salary = 5500 }; var e6 = new Emp { Deptno = 2, Empno = 5, Ename = "Katarzyna Malewska", HireDate = DateTime.Now.AddMonths(-3), Job = "Manager", Mgr = null, Salary = 8000 }; var e7 = new Emp { Deptno = null, Empno = 6, Ename = "Andrzej Kwiatkowski", HireDate = DateTime.Now.AddMonths(-3), Job = "System administrator", Mgr = null, Salary = 7500 }; var e8 = new Emp { Deptno = 2, Empno = 7, Ename = "Marcin Polewski", HireDate = DateTime.Now.AddMonths(-3), Job = "Mobile developer", Mgr = null, Salary = 4000 }; var e9 = new Emp { Deptno = 2, Empno = 8, Ename = "Władysław Torzewski", HireDate = DateTime.Now.AddMonths(-9), Job = "CTO", Mgr = null, Salary = 12000 }; var e10 = new Emp { Deptno = 2, Empno = 9, Ename = "Andrzej Dalewski", HireDate = DateTime.Now.AddMonths(-4), Job = "Database administrator", Mgr = null, Salary = 9000 }; empsCol.Add(e1); empsCol.Add(e2); empsCol.Add(e3); empsCol.Add(e4); empsCol.Add(e5); empsCol.Add(e6); empsCol.Add(e7); empsCol.Add(e8); empsCol.Add(e9); empsCol.Add(e10); Emps = empsCol; #endregion } /// /// SELECT * FROM Emps WHERE Job = "Backend programmer"; /// public static IEnumerable Task1() { IEnumerable result = Emps.Where(x => x.Job == "Backend programmer"); return result; } /// /// SELECT * FROM Emps Job = "Frontend programmer" AND Salary>1000 ORDER BY Ename DESC; /// public static IEnumerable Task2() { IEnumerable result = Emps .Where(x => x.Job == "Frontend programmer" && x.Salary > 1000) .OrderByDescending(x => x.Ename); return result; } /// /// SELECT MAX(Salary) FROM Emps; /// public static int Task3() { int result = Emps.Max(x => x.Salary); return result; } /// /// SELECT * FROM Emps WHERE Salary=(SELECT MAX(Salary) FROM Emps); /// public static IEnumerable Task4() { IEnumerable result = Emps.Where(x => x.Salary == Emps.Max(y => y.Salary)); return result; } /// /// SELECT ename AS Nazwisko, job AS Praca FROM Emps; /// public static IEnumerable Task5() { IEnumerable result = Emps.Select(x => new { Nazwisko = x.Ename, Praca = x.Job }); return result; } /// /// SELECT Emps.Ename, Emps.Job, Depts.Dname FROM Emps /// INNER JOIN Depts ON Emps.Deptno=Depts.Deptno /// Rezultat: Złączenie kolekcji Emps i Depts. /// public static IEnumerable Task6() { IEnumerable result = Emps.Join(Depts, x => x.Deptno, y => y.Deptno, (x, y) => new { Emps = x, Depts = y }) .Select(x => new { x.Emps.Ename, x.Emps.Job, x.Depts.Dname }); return result; } /// /// SELECT Job AS Praca, COUNT(1) LiczbaPracownikow FROM Emps GROUP BY Job; /// public static IEnumerable Task7() { IEnumerable result = Emps.GroupBy(x => x.Job).Select(x => new { Praca = x.Key, LiczbaPracownikow = x.Count() }); return result; } /// /// Zwróć wartość "true" jeśli choć jeden /// z elementów kolekcji pracuje jako "Backend programmer". /// public static bool Task8() { bool result = Emps.Any(x => x.Job == "Backend programmer"); return result; } /// /// SELECT TOP 1 * FROM Emp WHERE Job="Frontend programmer" /// ORDER BY HireDate DESC; /// public static Emp Task9() { Emp result = Emps.Where(x => x.Job == "Frontend programmer").OrderByDescending(x => x.HireDate).Take(1).First(); return result; } /// /// SELECT Ename, Job, Hiredate FROM Emps /// UNION /// SELECT "Brak wartości", null, null; /// public static IEnumerable Task10() { IEnumerable result = Emps .Select(x => new {x.Ename, x.Job, x.HireDate}) .Union(Emps.Select(y => new {Ename = "Brak wartości", Job = string.Empty, HireDate = (DateTime?) null})); return result; } /// /// Wykorzystując LINQ pobierz pracowników podzielony na departamenty pamiętając, że: /// 1. Interesują nas tylko departamenty z liczbą pracowników powyżej 1 /// 2. Chcemy zwrócić listę obiektów o następującej srukturze: /// [ /// {name: "RESEARCH", numOfEmployees: 3}, /// {name: "SALES", numOfEmployees: 5}, /// ... /// ] /// 3. Wykorzystaj typy anonimowe /// public static IEnumerable Task11() { IEnumerable result = Depts .Join(Emps, x => x.Deptno, y => y.Deptno, (x,y) => new { Depts = x, Emps = y}) .GroupBy(x => x.Depts.Dname) .Where(x => x.Count() > 1).Select(x => new { Name = x.Key, NumOfEmployees = x.Count() }); return result; } /// /// Napisz własną metodę rozszerzeń, która pozwoli skompilować się poniższemu fragmentowi kodu. /// Metodę dodaj do klasy CustomExtensionMethods, która zdefiniowana jest poniżej. /// /// Metoda powinna zwrócić tylko tych pracowników, którzy mają min. 1 bezpośredniego podwładnego. /// Pracownicy powinny w ramach kolekcji być posortowani po nazwisku (rosnąco) i pensji (malejąco). /// public static IEnumerable Task12() { IEnumerable result = Emps.GetEmpsWithSubordinates(); return result; } /// /// Poniższa metoda powinna zwracać pojedyczną liczbę int. /// Na wejściu przyjmujemy listę liczb całkowitych. /// Spróbuj z pomocą LINQ'a odnaleźć tę liczbę, które występuja w tablicy int'ów nieparzystą liczbę razy. /// Zakładamy, że zawsze będzie jedna taka liczba. /// Np: {1,1,1,1,1,1,10,1,1,1,1} => 10 /// public static int Task13(int[] arr) { int result = 0; result = arr.GroupBy(x => x).Where(x => x.Count() % 2 != 0).Select(x => x.Key).First(); return result; } /// /// Zwróć tylko te departamenty, które mają 5 pracowników lub nie mają pracowników w ogóle. /// Posortuj rezultat po nazwie departament rosnąco. /// public static IEnumerable Task14() { IEnumerable result = Depts .Where(x => Emps.Count(y => y.Deptno == x.Deptno) == 5 || Emps.All(y => y.Deptno != x.Deptno)) .OrderBy(x => x.Dname); return result; } } public static class CustomExtensionMethods { //Put your extension methods here public static IEnumerable GetEmpsWithSubordinates(this IEnumerable emps) { var result = emps.Where(e => emps.Any(e2 => e2.Mgr == e)).OrderBy(e => e.Ename).ThenByDescending(e => e.Salary); return result; } } }