private void OnNextCommand(object obj)
        {
            TaskManager.RunInBackground(() =>
            {
                _currentEmployeeIndex++;
                if (AllEmployees.Count() <= _currentEmployeeIndex)
                {
                    _currentEmployeeIndex = 0;
                }


                BuildUI();
            });
        }
        private void OnPreviousCommand(object obj)
        {
            TaskManager.RunInBackground(() =>
            {
                _currentEmployeeIndex--;
                if (_currentEmployeeIndex < 0)
                {
                    _currentEmployeeIndex = AllEmployees.Count();
                }


                BuildUI();
            });
        }
        private void BuildUI()
        {
            if (AllEmployees.Count() > _currentEmployeeIndex)
            {
                var Empobj = AllEmployees.Skip(_currentEmployeeIndex).FirstOrDefault();
                if (Empobj != null)
                {
                    CurrentEmployee = Empobj;


                    List <EmployeeHours> _list = new List <EmployeeHours>();

                    for (var i = Convert.ToDateTime(PayStartDate); i <= Convert.ToDateTime(PayEndDate); i = i.AddDays(1))
                    {
                        _list.Add(new EmployeeHours
                        {
                            WorkDate = i,

                            Employee = new Employee {
                                EmployeeNumber = CurrentEmployee.EmployeeNumber, EmployeeFirstName = CurrentEmployee.EmployeeFirstName, EmployeeLastName = CurrentEmployee.EmployeeLastName, HireDate = CurrentEmployee.HireDate
                            },
                            HoursWorked = 0,
                            Description = String.Empty
                        });
                    }


                    var db = EmployeeData.GetEmployeeHoursByEmpnonDate(CurrentEmployee.EmployeeNumber, Convert.ToDateTime(PayStartDate), Convert.ToDateTime(PayEndDate));
                    EmployeeHours = (from l in _list
                                     join d in db on l.WorkDate equals d.WorkDate into temp
                                     from d in temp.DefaultIfEmpty()
                                     select new EmployeeHours
                    {
                        WorkDate = l.WorkDate,
                        Employee = l.Employee,
                        Id = d == null?0:d.Id,
                        Description = d == null?String.Empty:d.Description,
                        HoursWorked = d == null?0 : d.HoursWorked
                    }).ToList();
                }
            }
        }
Example #4
0
        static void Main(string[] args)
        {
            ArrayList list = new ArrayList {
                "First", "Second", "Third"
            };
            IEnumerable <string> strings = list.Cast <string>();

            foreach (var item in list)
            {
                Console.WriteLine(item);
            }

            list = new ArrayList {
                1, 3, 2
            };
            IEnumerable <int> ints = list.Cast <int>();

            foreach (var item in ints)
            {
                Console.WriteLine(item);
            }

            // short cannot be casted to int
            //List<short> shortList = new List<short> { 1, 2, 3, 4 };
            //ints = shortList.Cast<int>();
            //foreach (var item in ints)
            //{
            //    Console.WriteLine(item);
            //}

            // на нетипізованій колекції ми не можемо визвати Select
            Console.WriteLine(new string('-', 80));
            foreach (var item in list.Cast <int>().Select(i => i * i))
            {
                Console.WriteLine(item);
            }

            // приведення до типу перед використанням колекції
            Console.WriteLine(new string('-', 80));
            List <IInterface> myList = new List <IInterface> {
                new MyClass {
                    A = 1, N = "Bla"
                },
                new MyClass {
                    A = 4, N = "Gla"
                },
                new MyClass {
                    A = 12, N = "Ila"
                },
                new MyClass {
                    A = 32, N = "Bla"
                },
                new MyClass {
                    A = 32, N = "Ala"
                }
            };

            List <IInterface> myList1 = new List <IInterface> {
                new MyClass {
                    A = 1, N = "Bla1"
                },
                new MyClass {
                    A = 4, N = "Gla1"
                },
                new MyClass {
                    A = 22, N = "Ila1"
                },
                new MyClass {
                    A = 31, N = "Bla1"
                },
                new MyClass {
                    A = 32, N = "Ala1"
                }
            };

            var myListElements = myList.Cast <MyClass>().Select(m => m.A);

            foreach (var item in myListElements)
            {
                Console.WriteLine(item);
            }

            // застосування декілької where
            Console.WriteLine(new string('-', 80));
            var myFilteredList = myList.Cast <MyClass>()
                                 .Where(m => m.A > 0)
                                 .Where(m => m.A > 1)
                                 .Where(m => m.A < 20)
                                 .Select(m => m.A * m.A);

            foreach (var item in myFilteredList)
            {
                Console.WriteLine(item);
            }

            // сортування даних
            Console.WriteLine(new string('-', 80));
            var mySortedList = myList.Cast <MyClass>()
                               .Where(m => m.A > 0)
                               .OrderByDescending(m => m.A)
                               .ThenBy(m => m.N)
                               .Select(m => new { A = m.A, N = m.N });

            foreach (var item in mySortedList)
            {
                Console.WriteLine(item.A + " : " + item.N);
            }

            // змінна let
            Console.WriteLine(new string('-', 80));
            var myLet = from m in myList.Cast <MyClass>()
                        let Number                       = m.A
                                                let Name = m.N
                                                           orderby Number
                                                           select new { Num = Number, SomeName = Name };

            foreach (var item in myLet)
            {
                Console.WriteLine(item);
            }

            // let в термінах розширюючих методів
            Console.WriteLine(new string('-', 80));
            var myLetInMethod = myList.Cast <MyClass>()
                                .Select(u => new { u, u.A })
                                .OrderBy(z => z.A)
                                .Select(z => new { Name = z.u.N, Number = z.A });

            foreach (var item in myLetInMethod)
            {
                Console.WriteLine(item);
            }

            // inner JOIN через LINQ
            Console.WriteLine(new string('-', 80));
            var myInnerJoinedList = from m in myList.Cast <MyClass>()
                                    join m1 in myList1.Cast <MyClass>()
                                    on m.A equals m1.A
                                    select new { m_A = m.A, m1_A = m1.A, m_Name = m.N, m1_Name = m1.N };

            foreach (var item in myInnerJoinedList)
            {
                Console.WriteLine("M.A = {0}, M1.A = {1}, M.Name = {2}, M1.Name = {3}", item.m_A, item.m1_A, item.m_Name, item.m1_Name);
            }

            // inner join фільтрована колекція (простіше якшо лівою є колекція яку треба сортувати + вигідніше сортувати до join)
            Console.WriteLine(new string('-', 80));
            var myInnerFilteredList = from m in myList.Cast <MyClass>()
                                      where m.A > 10
                                      join m1 in myList1.Cast <MyClass>()
                                      on m.A equals m1.A
                                      select new { mA = m.A, m1A = m1.A, mN = m.N, m1N = m1.N };

            var myInnerFilteredList1 = from m1 in myList1.Cast <MyClass>()
                                       join m in (from m in myList.Cast <MyClass>()
                                                  where m.A > 10
                                                  select m)
                                       on m1.A equals m.A
                                       select new { m_A = m.A, m1_A = m1.A, m_Name = m.N, m1_Name = m1.N };

            foreach (var item in myInnerFilteredList1)
            {
                Console.WriteLine(item);
            }

            // зєднання для робітників і менеджерів
            List <Human> employees = new List <Human>
            {
                new Employee {
                    ID = 1, Age = 23, Name = "Oles", ManagerID = 1
                },
                new Employee {
                    ID = 2, Age = 18, Name = "Alex", ManagerID = 2
                },
                new Employee {
                    ID = 3, Age = 34, Name = "Ivan", ManagerID = 1
                },
                new Employee {
                    ID = 4, Age = 22, Name = "Vasil", ManagerID = 2
                },
                new Employee {
                    ID = 5, Age = 23, Name = "Nazar", ManagerID = 1
                },
                new Employee {
                    ID = 6, Age = 54, Name = "Valentin", ManagerID = 2
                },
                new Employee {
                    ID = 7, Age = 33, Name = "Boris", ManagerID = 1
                }
            };
            List <Human> managers = new List <Human>
            {
                new Manager {
                    ID = 1, Age = 25, Name = "Bogdan", Employees = new List <int> {
                        1, 3, 5, 7
                    }
                },
                new Manager {
                    ID = 2, Age = 32, Name = "Roman", Employees = new List <int> {
                        2, 4
                    }
                },
                new Manager {
                    ID = 3, Age = 40, Name = "Valera"
                }
            };

            // inner join менеджерів і робітників
            Console.WriteLine("1" + new string('-', 79));
            var empMangInnerJoin = from e in employees.Cast <Employee>()
                                   join m in managers.Cast <Manager>()
                                   on e.ManagerID equals m.ID
                                   orderby e.ID
                                   select new { ManagerId = m.ID, ManagerName = m.Name, EmpId = e.ID, EmpName = e.Name };

            foreach (var item in empMangInnerJoin)
            {
                Console.WriteLine("Employee ID = {0}, manager id = {1}, employee name = {2}, manager name = {3}",
                                  item.EmpId, item.ManagerId, item.EmpName, item.ManagerName);
            }

            // inner join через розшивюючі методи
            Console.WriteLine("2" + new string('-', 79));
            var empMangInnerJoinExtMethods = employees.Cast <Employee>()
                                             .Join(managers.Cast <Manager>(),
                                                   e => e.ManagerID,
                                                   m => m.ID,
                                                   (e, m) => new { ManagerId = m.ID, ManagerName = m.Name, EmpId = e.ID, EmpName = e.Name })
                                             .OrderBy(z => z.EmpId);

            foreach (var item in empMangInnerJoinExtMethods)
            {
                Console.WriteLine("Employee ID = {0}, manager id = {1}, employee name = {2}, manager name = {3}",
                                  item.EmpId, item.ManagerId, item.EmpName, item.ManagerName);
            }

            // групове зєднання менеджера з робітниками (групове з'єднання виводить навіть ті елементи лівої таблиці які не мають
            // відповідних у правій таблиці - це як left outer join)
            Console.WriteLine("3" + new string('-', 79));
            var empMangInnerIntoJoin = from m in managers.Cast <Manager>()
                                       join e in employees.Cast <Employee>()
                                       on m.ID equals e.ManagerID into allEmployees
                                       where allEmployees.Count() > 1
                                       select new { ManagerId = m.ID, ManagerName = m.Name, AllEmployees = allEmployees };

            foreach (var manager in empMangInnerIntoJoin)
            {
                Console.WriteLine("Manager id = {0}, name = {1}", manager.ManagerId, manager.ManagerName);
                foreach (var emp in manager.AllEmployees)
                {
                    Console.WriteLine(" Employee id = {0}, name = {1}", emp.ID, emp.Name);
                }
            }

            // теж саме тільки з group join
            Console.WriteLine("4" + new string('-', 79));
            var empManagerOuterJoin = managers.Cast <Manager>()
                                      .GroupJoin(employees.Cast <Employee>(),
                                                 m => m.ID,
                                                 e => e.ManagerID,
                                                 (m, emps) => new { ManagerId = m.ID, ManagerName = m.Name, AllEmployees = emps });

            //.Where(z => z.AllEmployees.Count() > 1);

            foreach (var manager in empManagerOuterJoin)
            {
                Console.WriteLine("Manager id = {0}, name = {1}", manager.ManagerId, manager.ManagerName);
                foreach (var emp in manager.AllEmployees)
                {
                    Console.WriteLine(" Employee id = {0}, name = {1}", emp.ID, emp.Name);
                }
            }

            // генерування кількості працівників для кожного менеджера
            Console.WriteLine("5" + new string('-', 79));
            var mngEmpsCount = from m in managers.Cast <Manager>()
                               join e in employees.Cast <Employee>()
                               on m.ID equals e.ManagerID into AllEmployees
                               select new { ManagerID = m.ID, ManagerName = m.Name, EmpsCount = AllEmployees.Count() };


            foreach (var item in mngEmpsCount)
            {
                Console.WriteLine("Manager ID = {0}, manager name = {1}, employees number = {2}",
                                  item.ManagerID, item.ManagerName, item.EmpsCount);
            }

            // тож саме тільки з розширюючими методами
            Console.WriteLine("6" + new string('-', 79));
            var msgEmpsCountExpMethods = managers.Cast <Manager>()
                                         .GroupJoin(employees.Cast <Employee>(),
                                                    m => m.ID,
                                                    e => e.ManagerID,
                                                    (m, emps) => new { ManagerID = m.ID, ManagerName = m.Name, EmpsCount = emps.Count() });

            foreach (var item in msgEmpsCountExpMethods)
            {
                Console.WriteLine("Manager ID = {0}, manager name = {1}, employees number = {2}",
                                  item.ManagerID, item.ManagerName, item.EmpsCount);
            }

            // cross join
            Console.WriteLine("7" + new string('-', 79));
            var someSequence = from m in managers.Cast <Manager>()
                               from ml in myList.Cast <MyClass>()
                               select new { ManagerId = m.ID, SomeValue = ml.A };

            foreach (var item in someSequence)
            {
                Console.WriteLine("Manager id = {0}, some value = {1}", item.ManagerId, item.SomeValue);
            }

            // cross join коли права послідовність залежить від лівої послідовності
            Console.WriteLine("8" + new string('-', 79));
            var fooSequence = from n in Enumerable.Range(1, 4)
                              from m in Enumerable.Range(11, n)
                              select new { Left = n, Right = m };

            foreach (var item in fooSequence)
            {
                Console.WriteLine("Left = {0}, right = {1}", item.Left, item.Right);
            }

            // cross join коли права послідовність залежить від лівої послідовності
            // через розширюючі методи
            // *** також треба зазначити що SelectMany має потокове виконання, порівнюючи з внутрішніми і груповими
            // зєднаннями - де права таблиця завантажується одразу, тут права таблиця буде заново генеруватись для
            // кожного елемента з лівої таблиці ***
            Console.WriteLine("9" + new string('-', 79));
            var fooSequenceExtMethods = Enumerable.Range(1, 4)
                                        .SelectMany(n => Enumerable.Range(11, n),
                                                    (n, m) => new { Left = n, Right = m });

            foreach (var item in fooSequenceExtMethods)
            {
                Console.WriteLine("Left = {0}, right = {1}", item.Left, item.Right);
            }

            // cross join для працівників і менеджерів
            Console.WriteLine("9.1" + new string('-', 77));
            var empMngsSelMany = managers.Cast <Manager>()
                                 //.Where(m => m.ID == 1)
                                 .SelectMany(m => employees.Cast <Employee>()
                                             .Where(e => e.ManagerID == m.ID)
                                             .Select(e => new { EmpId = e.ID, EmpName = e.Name }),
                                             (m, e) => new { ManagerId = m.ID, EmpId = e.EmpId, EmpName = e.EmpName })
                                 .GroupBy(z => z.ManagerId,
                                          z => new { EmpId = z.EmpId, EmpName = z.EmpName })
                                 .OrderByDescending(z => z.Key);

            foreach (var item in empMngsSelMany)
            {
                //Console.WriteLine("Manager id = {0} : Employee id = {1}, employee name = {2}",item.ManagerId, item.EmpId, item.EmpName);
                Console.WriteLine("Manager id = {0}", item.Key);
                foreach (var e in item)
                {
                    Console.WriteLine(" Employee id = {0}, employee name = {1}", e.EmpId, e.EmpName);
                }
            }

            // групування елементів
            // *** групування не виконується потоково воно буферизує елементи які відсортовані по ключу ***
            Console.WriteLine("10" + new string('-', 78));
            var groupedEmployees = from e in employees.Cast <Employee>()
                                   where e.ManagerID >= 1
                                   group e by e.ManagerID;

            foreach (var item in groupedEmployees)
            {
                Console.WriteLine("Manager id : {0}", item.Key);
                foreach (var emp in item)
                {
                    Console.WriteLine(" Employee id = {0}, employee name = {1}", emp.ID, emp.Name);
                }
            }

            // групування елементів на основі розширюючих методів
            Console.WriteLine("11" + new string('-', 78));
            var groupedEmployeesExtMethods = employees.Cast <Employee>()
                                             .Where(e => e.ManagerID >= 1)
                                             .GroupBy(e => e.ManagerID);

            foreach (var item in groupedEmployeesExtMethods)
            {
                Console.WriteLine("Manager id : {0}", item.Key);
                foreach (var emp in item)
                {
                    Console.WriteLine(" Employee id = {0}, employee name = {1}", emp.ID, emp.Name);
                }
            }

            // групування елементів вибираючи не сам елемент а його пропертю
            Console.WriteLine("12" + new string('-', 78));
            var groupedEmpsPropetry = from e in employees.Cast <Employee>()
                                      where e.ManagerID >= 1
                                      group e.ID by e.ManagerID;

            foreach (var item in groupedEmpsPropetry)
            {
                Console.WriteLine("Manager id = {0}", item.Key);
                foreach (var e in item)
                {
                    Console.WriteLine(" " + e);
                }
            }

            // теж саме через розширюючий метод
            Console.WriteLine("13" + new string('-', 78));
            var groupedEpmsPropExtMethods = employees.Cast <Employee>()
                                            .GroupBy(e => e.ManagerID,
                                                     e => e.ID);

            foreach (var item in groupedEpmsPropExtMethods)
            {
                Console.WriteLine("Manager id = {0}", item.Key);
                foreach (var e in item)
                {
                    Console.WriteLine(" " + e);
                }
            }

            // продовження запиту
            Console.WriteLine("14" + new string('-', 78));
            var queryContinuation = from e in employees.Cast <Employee>()
                                    where e.ManagerID >= 0
                                    group e by e.ManagerID
                                    into groupedSeq
                                    select new { ManagerId = groupedSeq.Key, Count = groupedSeq.Count() };

            foreach (var item in queryContinuation)
            {
                Console.WriteLine("Manager id = {0}, emps count = {1}", item.ManagerId, item.Count);
            }

            // продовження запиту через розширюючі методи
            Console.WriteLine("15" + new string('-', 78));
            var queryContinuationExtMethods = employees.Cast <Employee>()
                                              .Where(e => e.ManagerID >= 1)
                                              .GroupBy(e => e.ManagerID)
                                              .Select(z => new { ManagerId = z.Key, Count = z.Count() });

            foreach (var item in queryContinuationExtMethods)
            {
                Console.WriteLine("Manager id = {0}, emps count = {1}", item.ManagerId, item.Count);
            }



            Console.ReadLine();
        }