示例#1
0
        static void Main()
        {
            //Problem_02:
            //            1.	Inserts an employee
            //2.	Prints his/her primary key generated by the DB
            //3.	Changes the employee first name and saves it to the database
            //4.	Deletes an employee

            Employee employee = new Employee();

            employee.FirstName    = "Pesho";
            employee.LastName     = "Peshov";
            employee.JobTitle     = "Marketing Manager";
            employee.DepartmentID = 5;
            employee.ManagerID    = 10;
            employee.HireDate     = DateTime.Now;
            employee.Salary       = 5000m;
            employee.AddressID    = 100;

            DAO.Add(employee);

            int employeeId = employee.EmployeeID;

            Console.WriteLine(employeeId);

            employee.FirstName = "Gosho";
            DAO.Modify(employee);
            Console.WriteLine(DAO.FindByKey(employeeId).FirstName);
            Console.ReadLine();

            DAO.Delete(employee);
            //Console.WriteLine(DAO.FindByKey(employeeId).FirstName);

            //Problem03_Database Search Queries

            //1.	Find all employees who have projects started in the time period 2001 - 2003 (inclusive).
            //Select the project's name, start date, end date and manager name.

            var context = new SoftUniEntities();

            var employees = context.Employees
                            .Where(e => e.Projects
                                   .Any(p => p.StartDate.Year >= 2001 && p.StartDate.Year <= 2003))
                            .Select(e => new
            {
                e.FirstName,
                e.LastName,
                Projects = e.Projects
                           .Where(p => p.StartDate.Year >= 2001 && p.StartDate.Year <= 2003)
                           .Select(p => new
                {
                    p.Name,
                    p.StartDate,
                    p.EndDate
                }),
                ManagerName = e.Managers.FirstName + " " + e.Managers.LastName
            });

            foreach (var emp in employees)
            {
                Console.WriteLine("Name: {0} {1}", emp.FirstName, emp.LastName);
                Console.WriteLine("\tManager: {0}", emp.ManagerName);
                Console.WriteLine("\tProjects:");
                foreach (var project in employee.Projects)
                {
                    Console.WriteLine("\t\tProject Name: {0}\n\t\tStart Date:" +
                                      " {1}\n\t\tEnd Date{2}\n",
                                      project.Name,
                                      project.StartDate,
                                      project.EndDate);
                }

                Console.WriteLine();
            }


            //2.	Find all addresses, ordered by the number of employees who live there
            //(descending), then by town name (ascending).
            //Take only the first 10 addresses and select their address text,
            //town name and employee count.

            var addresses = context.Addresses
                            .OrderByDescending(a => a.Employees.Count)
                            .Take(10)
                            .Select(a => new
            {
                a.AddressText,
                Town      = a.Town.Name,
                Employees = a.Employees.Count
            });

            foreach (var address in addresses)
            {
                Console.WriteLine("{0}, {1} - {2} employees",
                                  address.AddressText,
                                  address.Town,
                                  address.Employees);
            }

            //3.	Get an employee by id (e.g. 147).
            //Select only his/her first name, last name, job title and projects
            //(only their names). The projects should be ordered by name (ascending).

            var employeeSearched = context.Employees
                                   .Where(e => e.EmployeeID == 147)
                                   .Select(e => new
            {
                e.FirstName,
                e.LastName,
                e.JobTitle,
                Projects = e.Projects.Select(p => p.Name).OrderBy(p => p)
            })
                                   .FirstOrDefault();

            Console.WriteLine("{0} {1} - {2}\nProjects:",
                              employeeSearched.FirstName,
                              employeeSearched.LastName,
                              employeeSearched.JobTitle);

            foreach (var project in employeeSearched.Projects)
            {
                Console.WriteLine("\t" + project);
            }

            //4.	Find all departments with more than 5 employees.
            //Order them by employee count (ascending).
            //Select the department name, manager name and first name, last name,
            //hire date and job title of every employee.

            var departments = context.Departments
                              .Where(d => d.Employees.Count > 5)
                              .OrderBy(d => d.Employees.Count)
                              .Select(d => new
            {
                DepartmentName = d.Name,
                ManagerName    = d.Managers.FirstName
                                 + " "
                                 + d.Managers.LastName,
                Employees = d.Employees.Select(e => new
                {
                    e.FirstName,
                    e.LastName,
                    e.HireDate,
                    e.JobTitle
                }),
                EmployeesCount = d.Employees.Count
            });

            foreach (var department in departments)
            {
                Console.WriteLine("Department name: {0}, employess in department - {1}",
                                  department.DepartmentName, department.EmployeesCount);
                Console.WriteLine("Manager: {0}\n\nEmployees:", department.ManagerName);

                foreach (var emp in department.Employees)
                {
                    Console.WriteLine("\tName: {0} {0}", emp.FirstName, emp.LastName);
                    Console.WriteLine("\tHire Date: " + emp.HireDate);
                    Console.WriteLine("\tJob Title: " + emp.JobTitle);
                    Console.WriteLine();
                }

                Console.WriteLine();
            }

            //Problem 4.	Native SQL Query

            var stopWatch = new Stopwatch();

            var employeesLINQ = context.Employees
                                .Where(e => e.Projects.Any(p => p.StartDate.Year == 2002))
                                .Select(e => e.FirstName);

            Console.WriteLine("LINQ: {0}", stopWatch.Elapsed);

            stopWatch.Restart();

            var employeesSQL = context.Database.SqlQuery <string>("SELECT Name FROM" +
                                                                  "Employees e JOIN EmployeesProjects ep ON e.EmployeeID = ep.EmployeeID" +
                                                                  "JOIN Projects p ON ep.ProjectID = p.ProjectID" +
                                                                  "WHERE YEAR(p.StartDate) = 2002");

            Console.WriteLine("Native: {0}", stopWatch.Elapsed);

            //It is strange but LINQ took less time.

            //Problem 5.	Concurrent Database Changes with EF

            var context1 = new SoftUniEntities();
            var context2 = new SoftUniEntities();

            var employee1 = context1.Employees.Find(147);
            var employee2 = context2.Employees.Find(147);

            employee1.FirstName = "change1";
            employee2.FirstName = "change2";

            context1.SaveChanges();

            try
            {
                context2.SaveChanges();
            }
            catch (Exception)
            {
                Console.WriteLine("An exception occured");;
            }

            employee = context.Employees.Find(147);

            Console.WriteLine(employee.FirstName);

            //Without [Concurrency Mode]  the second change takes place.

            employee1 = context1.Employees.Find(147);
            employee2 = context2.Employees.Find(147);

            employee1.FirstName = "update3";
            employee2.FirstName = "update2";

            //context1.SaveChanges();
            try
            {
                context1.SaveChanges();
            }
            catch (Exception)
            {
                Console.WriteLine("An exception occured");;
            }
            try
            {
                context2.SaveChanges();
            }
            catch (Exception)
            {
                Console.WriteLine("An exception occured");;
            }


            employee = context.Employees.Find(147);

            Console.WriteLine(employee.FirstName);

            //When concurrency mode is on, the first change gets valid and the application throws an exception
            //when we try to save the second change

            var projects = context.usp_FindProjectsByEmployeesName("Laura", "Norman");

            foreach (var project in projects)
            {
                Console.WriteLine("{0} - {1}, {2}\n", project.Name, project.Description, project.StartDate);
            }

            Console.ReadLine();
        }