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
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.