Софтуерно Инженерство
Loading...
+ Нов въпрос
Hristo_Penchev avatar Hristo_Penchev 388 Точки

[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 388 Точки

Намерих как:

 

.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 388 Точки

  Това аз си го прекръстих, като правих базата. Мисля, че беше 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 388 Точки

Погледни решението в Пейстбин 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