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
Hristo_Penchev avatar Hristo_Penchev 389 Точки

Намерих как:

 

.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
                        });

 

Оставям темата, понеже може да е полезна за някого

2
Barish avatar Barish 8 Точки

"ManagerName = e.Managers.FirstName + " " + e.Managers.LastName "
това e.Managers го няма при мене от къде го имаш?

0
brslv avatar brslv 69 Точки

Доколкото помня, Entity дава странни имена на селф-реферънс връзки. Може да ти е Employee1 или нещо от сорта... ;)

0
Hristo_Penchev avatar Hristo_Penchev 389 Точки

  Това аз си го прекръстих, като правих базата. Мисля, че беше Employee1 или нещо такова, Връзката е много към 0 или 1 - един служител си има за мениджър друг служител или евентуално няма такъв. Един всеки служител може да има 0 или повече подчинени.

0
ksevery avatar ksevery 35 Точки

Значи за да вземеш тези проекти, които искаш, просто трябва вместо директно да пишеш e.Project.Where(...) да го направиш Projects = e.Projects.Where(...). След това можеш направо да направиш chain със Select, за да вземеш само каквото ти трябва от проектите. Т.е. да направиш Projects = e.Projects.Where(...).Select(...).

Поздрави,
Константин

 

EDIT: Закъснях с около минута с отговора, ще го оставя все пак.

0
18/07/2015 14:48:58
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 =&gt; e.Projects.Any(p =&gt; (p.StartDate &gt;= lowerDate &amp;&amp; p.EndDate &lt;= upperDate)))
                .Select(e =&gt; new
                {
                    e.FirstName,
                    e.LastName,
                    Projects = e.Projects.Select(p =&gt; 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
a_rusenov avatar a_rusenov 1103 Точки

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

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