Loading...
stefism1 avatar stefism1 28 Точки

Entity Framework Introduction, 13. Find Employees by First Name Starting With Sa

Здравейте колеги.
Може ли някой да ми каже, защо на тази привидно най-лесна задача ми гърми последният тест?

1) Failed : Test_002.ValidateOutput :   Returned value is incorrect!  Expected string length 0 but was 104. Strings differ at index 0.

Ето това ми е кода. Даже специално направих ако няма такива хора да връща празен стринг и пак. Някой да знае къде е проблема или да я има решена да видя?

public static string GetEmployeesByFirstNameStartingWithSa(SoftUniContext context)
        // 13.    Find Employees by First Name Starting with "Sa"
        {
            var sb = new StringBuilder();

            var employees = context.Employees
                .Select(e => new
                {
                    e.FirstName,
                    e.LastName,
                    e.JobTitle,
                    e.Salary
                }).Where(e => e.FirstName.StartsWith("Sa"))
                .OrderBy(e => e.FirstName).ThenBy(e => e.LastName)
                .ToList();

            if (employees.Count == 0)
            {
                return "";
            }

            foreach (var e in employees)
            {
                sb.AppendLine($"{e.FirstName} {e.LastName} - {e.JobTitle} - (${e.Salary:F2})");
            }
         
            return sb.ToString().TrimEnd();
        }

 

Ето и линк към задачата в judge - https://judge.softuni.bg/Contests/351/Entity-Framework-Introduction

Мерси предварително на всички!

Тагове:
Bobby_Apostolov avatar Bobby_Apostolov 128 Точки
Best Answer

Здравей, Крис и той не можа да вземе 100/100 на тази задача и се оказа, че има проблем с теста в judge, кода ти е както трябва, и при мен също е 66/100.
Може да погледнеш кода на последния тест, и при него не се сортират служителите по име, Крис каза да следим и че скоро ще го оправят
:)

1
nickwork avatar nickwork 657 Точки

Пускам ти решение..добре е ако можеш да филтрираш в самото начало да го правиш...по този начин ще дърпаш по малко данни от базата, което от своя страна ще оптимизира времето за изпълнение на заявката

public static string GetEmployeesByFirstNameStartingWithSa(SoftUniContext context)
        {
            StringBuilder sb = new StringBuilder();

            var employees = context.Employees
                .Where(x => x.FirstName.StartsWith("Sa"))
                .Select(x => new Employee
                {
                    FirstName = x.FirstName,
                    LastName = x.LastName,
                    JobTitle = x.JobTitle,
                    Salary = x.Salary
                }
                )
                .OrderBy(x => x.FirstName)
                .ThenBy(x => x.LastName)
                .ToList();

            foreach (var e in employees)
            {
                sb.AppendLine($"{e.FirstName} {e.LastName} - {e.JobTitle} - (${e.Salary:f2})");
            }

            return sb.ToString().TrimEnd();
        }

1
stefism1 avatar stefism1 28 Точки

Здравей.

Мерси!
Само да питам, това решение дали ще можеш да го качиш пак в judge и да видиш дали сега ще ти даде 100 от 100?
Защото след като изкопирах кода ти и го качах, пак ми дава същата грешка indecision

Има ли вариант нещо да са променили тестовете и да не са коректни в момента?

Изпратам ти и линк към целия ми проект в гит

https://github.com/stefism/Projects/tree/master/C%23%20Entity%20Framework%20Core%20June%202020/08%20EXERCISE%20ENTITY%20FRAMEWORK%20INTRODUCTION/SoftUni/SoftUni

Ако погледнеш в StartUp файла, най-горе е метода с твоя код. Определено не разбирам какво се случва?

1
stefism1 avatar stefism1 28 Точки

Здравей отново.
Отоносно "добре е ако можеш да филтрираш в самото начало да го правиш", Понеже ми стана интересно, специално проверих заявките със SQL Server Profiler и както и предполагах, при следните два кода

1.

var employees = context.Employees
                .Where(e => e.Salary > 50000)
                .Select(e => new
                {
                    e.FirstName,
                    e.Salary
                })
                .OrderBy(e => e.FirstName).ToList();

2.

var employees = context.Employees
                .Select(e => new
                {
                    e.FirstName,
                    e.Salary
                }).Where(e => e.Salary > 50000)
                .OrderBy(e => e.FirstName).ToList();

Заявката, която се генерира е абсолютно една и съща, а именно:

SELECT [e].[FirstName], [e].[Salary]
FROM [Employees] AS [e]
WHERE [e].[Salary] > 50000.0
ORDER BY [e].[FirstName]

Тоест няма значение Where клаузата дали ще е написана преди или след .Select(). Важното е да е написана преди .ToList() или преди материализацията.

0
02/07/2020 15:37:07
TeodorStefanovPld avatar TeodorStefanovPld 1274 Точки

Това са глупости, както е посочил колегата, where няма никакво значение къде си го сложил. Стига да е преди .toList() който е терминиращ и от iquerable списъка ви става ienumerable и буквално се изпълнява заявката, другото е без значение а селекта позвоялва да е по оптимизирана.

Отиваш на канала на Кенов в youtube  и гледай малко да се образоваш... Имало значение къде е where... боже и това доживях да прочета.да бъде първи и преди select...

Aми ако имам сложна заявка от 2 таблици с include и ми трябва стойност от врата таблица за where да пак ще го напраскам най-горе хах ок.

-3
Bobby_Apostolov avatar Bobby_Apostolov 128 Точки

Правилни решения на колеги от предишни инстанции на курса пак не минават

1
stefism1 avatar stefism1 28 Точки

О, много ти благодаря!!! yes
2 часа се чудя какво става начи, само си изгубих времето.
Нищо, важното е, че не е проблема в нас.
Много ми беше полезен. Мерси пак :)

1
nickwork avatar nickwork 657 Точки

Проблема е в judge

1
stefism1 avatar stefism1 28 Точки

Да, така се оказа :)

0
stefism1 avatar stefism1 28 Точки

Хах laugh

Звучи яко. Ако не оправят теста, така ще стане enlightened

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