Професионална програма
Loading...
Hristo_Penchev avatar Hristo_Penchev 389 Точки

[Homework] Problem 3. Database Search Queries, Entity Framework - Как да вземем само това, което ни трябва от ICollection връзка

Колеги, мъча трета задача, първото подусловие на домашното Entity Framework. Измислих следното работещо решение:

http://pastebin.com/uEU34S7K

Хубавото е, че изпращам само една заявка според SQL Profiler. Макар че не знам точно защо. Предполагам, че това

  1. Select(e => new
  2.                         {
  3.                             e.FirstName,
  4.                             e.LastName,
  5.                             e.Projects,
  6.                             ManagerName = e.Managers.FirstName + " " + e.Managers.LastName
  7.                         })
зарежда целите проекти, не само референциите към тях. Не ми е съвсем ясно как работи Lazy loading в случая.
 
Това, което ме дразни, е, че за всеки служител взема всички проекти, не само тези, които ни трябват. Опитах да направя на пети ред нещо като e.Projects.Where(e => e.StartDate...), но не ми дава. Разбира се, мога да направя филтъра при печатането, но не е това идеята. Искам към employees да закача само тези проекти, които ни трябват, не да дърпам всичко.
Другият ми въпрос - искам от проектите да изтегля само име, дата на започване и дата на приключване, а не цялата информация за проекта. Но отново не мога да вложа селект в селекта. Някой има ли идея как да го направя?
Тагове:
0
Databases Basics
brslv avatar brslv 69 Точки

Колега, сега погледнах задачата и доколкото мога да се ориентирам, в задачата се изисква да изпринтим само онези емплоита, които имат такива проекти. Твоето решение изкарва всички емплоита. Поправи ме, ако греша. :) 

Опитвам в момента да я добутам до някакво решение, но не ми се получава. Някакви идеи къде бъркам? Не ми изкарва нищо като резултат, а мисля, че това е решението...(Employee1 е Managers, реално, но ме мързи да го оправя)...

Мерси.

var context = new SoftUniEntities();
            var lowerDate = new DateTime(2001, 1, 1);
            var upperDate = new DateTime(2003, 1, 1);

            var employeesAndProjectsInRange = context.Employees
                .Where(e => e.Projects.Any(p => (p.StartDate >= lowerDate && p.EndDate <= upperDate)))
                .Select(e => new
                {
                    e.FirstName,
                    e.LastName,
                    Projects = e.Projects.Select(p => new {
                        ProjectName = p.Name,
                        p.StartDate,
                        p.EndDate
                    }),
                    Manager = e.Employee1.FirstName
                });

            // testing...
            foreach (var item in employeesAndProjectsInRange)
            {
                Console.WriteLine(item.FirstName);
            }

 

0
Hristo_Penchev avatar Hristo_Penchev 389 Точки

Погледни решението в Пейстбин 4-5 ред:

 

  1. .Where(e => e.Projects
  2.                     .Any(p => p.StartDate.Year >= 2001 && p.StartDate.Year <= 2003))
 
Това филтрира само служителите, които имат такива проекти.
0
brslv avatar brslv 69 Точки

Извинявай, мое недоглеждане. ;)

0