Loading...
sevdalin avatar sevdalin 38 Точки

[Introduction to EF] - Problem {5} - Departments with more than 5 Employees

Здравейте,

блъсках си главата 1 час, защото накрая не ми излизаха резултатите в реда, в който трябва да бъдат за Judge.

Погледнах авторското решение, като то е доста по семпло направено и не достатъчно оптимизирано (не че моето е кой знае колко по-добре), но това в случея няма значение. Това което има значение е, защо има разлика в подредбата на Employees в Код номер 1 (моят) и Код номер 2?

Не мога да разбера какво се случва, но за пример при Код номер 1, резултатите започват по следният начин:

 

Engineering Terri
Roberto Tamburello Engineering Manager
Gail Erickson Design Engineer
Jossef Goldberg Design Engineer
Terri Duffy Vice President of Engineering
Michael Sullivan Senior Design Engineer
Sharon Salavaria Design Engineer

 

Докато при Код номер 2 започват по следният начин:

Engineering Terri
Terri Duffy Vice President of Engineering
Roberto Tamburello Engineering Manager
Gail Erickson Design Engineer
Jossef Goldberg Design Engineer
Michael Sullivan Senior Design Engineer
Sharon Salavaria Design Engineer

Моите подозрения са, че нещо се обърква при създаването на анонимти типове, но явно не знам достатъчно добре детайлите за анонимните типове и не разбирам какво се случва.

Надявам се някой да може да обясни, какво се случва и от къде идва разликата!

Благодаря!

 

Код номер 1:

var deparments = softUniContext.Departments
                .Where(d => d.Employees.Count > 5)
                .OrderBy(d => d.Employees.Count)
                .Select(d => new
                {
                    d.Name,
                    managerFirstName = d.Manager.FirstName,
                    employees = d.Employees
                        .Select(e => new
                        {
                            e.FirstName,
                            e.LastName,
                            e.JobTitle
                        })
                })
                .ToList();

foreach (var depart in deparments)
{
    Console.WriteLine($"{depart.Name} {depart.managerFirstName}");
    foreach (var emp in depart.employees)
    {
       Console.WriteLine($"{emp.FirstName} {emp.LastName} {emp.JobTitle}");
    }
}

 

Код номер 2:

var departTest = softUniContext.Departments
      .Where(d => d.Employees.Count > 5)
      .OrderBy(d => d.Employees.Count);

foreach (var depart in departTest)
{
    Console.WriteLine($"{depart.Name} {depart.Manager.FirstName}");
    foreach (var emp in depart.Employees)
    {
        Console.WriteLine($"{emp.FirstName} {emp.LastName} {emp.JobTitle}");
    }
}

 

Тагове:
0
Databases Advanced - Entity Framework 10/10/2017 15:06:30
VasilValchanov avatar VasilValchanov 555 Точки

При първия случай има ToList(); и най-вероятно като се презаписват се разбъркват понеже в случая не извикваш стабилен сортиращ алгоритъм като ThenBy (според мен).
 

0
10/10/2017 15:36:29
sevdalin avatar sevdalin 38 Точки

Тествах го и без List, резултата е същият.

0
Tanyo avatar Tanyo 152 Точки

При първия (твоя) код, куерито което се генерира е със вложени селекти и имената на служителите са вероятно така както са и в таблицата в базата  (последователност). 

При втория код, куерито което се генерира използва Inner join и след това вероятно прави group by, за да намери броя на служителите и да ги сортира, съответно при този group by, подредбата се разваля. 

Не съм рънвал кода за да съм на 100 % сигурен, но това ми идва като идея като го гледам.... 

Най - добре си пусни един SQL Profiler и виж какви куерита ти праща програмата към сървъра, след това може да си ги изпълняваш в SSMS и да си анализираш.

0
sevdalin avatar sevdalin 38 Точки

Ето го Query-то, което се рънва. Но няма GroupBy, има OrderBy накрая ама не съм сигурен, какво точно подрежда.

SELECT 
    [Project2].[DepartmentID] AS [DepartmentID], 
    [Project2].[Name] AS [Name], 
    [Project2].[ManagerID] AS [ManagerID]
    FROM ( SELECT 
        [Project1].[DepartmentID] AS [DepartmentID], 
        [Project1].[Name] AS [Name], 
        [Project1].[ManagerID] AS [ManagerID], 
        (SELECT 
            COUNT(1) AS [A1]
            FROM [dbo].[Employees] AS [Extent3]
            WHERE [Project1].[DepartmentID] = [Extent3].[DepartmentID]) AS [C1]
        FROM ( SELECT 
            [Extent1].[DepartmentID] AS [DepartmentID], 
            [Extent1].[Name] AS [Name], 
            [Extent1].[ManagerID] AS [ManagerID], 
            (SELECT 
                COUNT(1) AS [A1]
                FROM [dbo].[Employees] AS [Extent2]
                WHERE [Extent1].[DepartmentID] = [Extent2].[DepartmentID]) AS [C1]
            FROM [dbo].[Departments] AS [Extent1]
        )  AS [Project1]
        WHERE [Project1].[C1] > 5
    )  AS [Project2]
    ORDER BY [Project2].[C1] ASC

 

0
Tanyo avatar Tanyo 152 Точки

Това е вероятно твоето куери, пусни и другото.

0
sevdalin avatar sevdalin 38 Точки

Не, това не е моето. Моето си стои закоментирано.

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