using LinqTutorials.Models;
using System;
using System.Collections.Generic;
using System.Linq;
namespace LinqTutorials
{
public static class LinqTasks
{
public static IEnumerable<Emp> Emps { get; set; }
public static IEnumerable<Dept> Depts { get; set; }
static LinqTasks()
{
var empsCol
= new List
<Emp
>();
var deptsCol
= new List
<Dept
>();
#region Load depts
{
Deptno = 1,
Dname = "Research",
Loc = "Warsaw"
};
{
Deptno = 2,
Dname = "Human Resources",
Loc = "New York"
};
{
Deptno = 3,
Dname = "IT",
Loc = "Los Angeles"
};
deptsCol.Add(d1);
deptsCol.Add(d2);
deptsCol.Add(d3);
Depts = deptsCol;
#endregion
#region Load emps
{
Deptno = 1,
Empno = 1,
Ename = "Jan Kowalski",
HireDate = DateTime.Now.AddMonths(-5),
Job = "Backend programmer",
Mgr = null,
Salary = 2000
};
{
Deptno = 1,
Empno = 20,
Ename = "Anna Malewska",
HireDate = DateTime.Now.AddMonths(-7),
Job = "Frontend programmer",
Mgr = e1,
Salary = 4000
};
{
Deptno = 1,
Empno = 2,
Ename = "Marcin Korewski",
HireDate = DateTime.Now.AddMonths(-3),
Job = "Frontend programmer",
Mgr = null,
Salary = 5000
};
{
Deptno = 2,
Empno = 3,
Ename = "Paweł Latowski",
HireDate = DateTime.Now.AddMonths(-2),
Job = "Frontend programmer",
Mgr = e2,
Salary = 5500
};
{
Deptno = 2,
Empno = 4,
Ename = "Michał Kowalski",
HireDate = DateTime.Now.AddMonths(-2),
Job = "Backend programmer",
Mgr = e2,
Salary = 5500
};
{
Deptno = 2,
Empno = 5,
Ename = "Katarzyna Malewska",
HireDate = DateTime.Now.AddMonths(-3),
Job = "Manager",
Mgr = null,
Salary = 8000
};
{
Deptno = null,
Empno = 6,
Ename = "Andrzej Kwiatkowski",
HireDate = DateTime.Now.AddMonths(-3),
Job = "System administrator",
Mgr = null,
Salary = 7500
};
{
Deptno = 2,
Empno = 7,
Ename = "Marcin Polewski",
HireDate = DateTime.Now.AddMonths(-3),
Job = "Mobile developer",
Mgr = null,
Salary = 4000
};
{
Deptno = 2,
Empno = 8,
Ename = "Władysław Torzewski",
HireDate = DateTime.Now.AddMonths(-9),
Job = "CTO",
Mgr = null,
Salary = 12000
};
{
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
}
/// <summary>
/// SELECT * FROM Emps WHERE Job = "Backend programmer";
/// </summary>
public static IEnumerable<Emp> Task1()
{
IEnumerable<Emp> result = Emps.Where(x => x.Job == "Backend programmer");
return result;
}
/// <summary>
/// SELECT * FROM Emps Job = "Frontend programmer" AND Salary>1000 ORDER BY Ename DESC;
/// </summary>
public static IEnumerable<Emp> Task2()
{
IEnumerable<Emp> result = Emps
.Where(x => x.Job == "Frontend programmer" && x.Salary > 1000)
.OrderByDescending(x => x.Ename);
return result;
}
/// <summary>
/// SELECT MAX(Salary) FROM Emps;
/// </summary>
public static int Task3()
{
int result = Emps.Max(x => x.Salary);
return result;
}
/// <summary>
/// SELECT * FROM Emps WHERE Salary=(SELECT MAX(Salary) FROM Emps);
/// </summary>
public static IEnumerable<Emp> Task4()
{
IEnumerable<Emp> result = Emps.Where(x => x.Salary == Emps.Max(y => y.Salary));
return result;
}
/// <summary>
/// SELECT ename AS Nazwisko, job AS Praca FROM Emps;
/// </summary>
public static IEnumerable<object> Task5()
{
IEnumerable
<object> result
= Emps
.Select(x
=> new
{
Nazwisko = x.Ename,
Praca = x.Job
});
return result;
}
/// <summary>
/// SELECT Emps.Ename, Emps.Job, Depts.Dname FROM Emps
/// INNER JOIN Depts ON Emps.Deptno=Depts.Deptno
/// Rezultat: Złączenie kolekcji Emps i Depts.
/// </summary>
public static IEnumerable<object> Task6()
{
IEnumerable
<object> 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;
}
/// <summary>
/// SELECT Job AS Praca, COUNT(1) LiczbaPracownikow FROM Emps GROUP BY Job;
/// </summary>
public static IEnumerable<object> Task7()
{
IEnumerable
<object> result
= Emps
.GroupBy(x
=> x
.Job).Select(x
=> new
{
Praca = x.Key,
LiczbaPracownikow = x.Count()
});
return result;
}
/// <summary>
/// Zwróć wartość "true" jeśli choć jeden
/// z elementów kolekcji pracuje jako "Backend programmer".
/// </summary>
public static bool Task8()
{
bool result = Emps.Any(x => x.Job == "Backend programmer");
return result;
}
/// <summary>
/// SELECT TOP 1 * FROM Emp WHERE Job="Frontend programmer"
/// ORDER BY HireDate DESC;
/// </summary>
public static Emp Task9()
{
Emp result = Emps.Where(x => x.Job == "Frontend programmer").OrderByDescending(x => x.HireDate).Take(1).First();
return result;
}
/// <summary>
/// SELECT Ename, Job, Hiredate FROM Emps
/// UNION
/// SELECT "Brak wartości", null, null;
/// </summary>
public static IEnumerable<object> Task10()
{
IEnumerable<object> 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;
}
/// <summary>
/// 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
/// </summary>
public static IEnumerable<object> Task11()
{
IEnumerable<object> 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;
}
/// <summary>
/// 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).
/// </summary>
public static IEnumerable<Emp> Task12()
{
IEnumerable<Emp> result = Emps.GetEmpsWithSubordinates();
return result;
}
/// <summary>
/// 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
/// </summary>
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;
}
/// <summary>
/// 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.
/// </summary>
public static IEnumerable<Dept> Task14()
{
IEnumerable<Dept> 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<Emp> GetEmpsWithSubordinates(this IEnumerable<Emp> emps)
{
var result = emps.Where(e => emps.Any(e2 => e2.Mgr == e)).OrderBy(e => e.Ename).ThenByDescending(e => e.Salary);
return result;
}
}
}