[Databases] Домашно Entity Framework Performance


5

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

source


Успех!




Отговори



1
http://pastebin.com/NfUqM2cL и http://pastebin.com/GfVcLuKF
Не ми е ясно кои стойности от profiler-а точно се вземат, така че коментарът ми под всяка част е с неясна точност.. Първите заявки съм написала възможно най-грешно.

от spareva (1375 точки)


0
на първа, след като използваш Address.Town можеш да дадеш направо .Include("Address.Town") - това ще направи още един JOIN и ще го ускори още повече.

от staafl (5770 точки)

0
Ей значи, мъчих се, писах .(Include("address").Include("town")) и други всякакви такива, само това не :) Мерси

от spareva (1375 точки)


0

Решения

Разликите са наистина осезателни. Лекцията беше доста полезна, понеже някои неща стават имплицитно и ако не ги знаем може доста да попсуваме.


от georgi.ivanov (3261 точки)


3

Решение -> Github

На първа задача в случая без Include ми прави ~350 заявки, а с Include ми прави ~50. След съвета на Велко, вече прави не 50, а 1 заявка.

Снимка

На втора задача в случая с 3те ToList() ми направи ~ 650 заявки, а с 1 ToList() ми направи 1 заявка(1 и 3 са за Trace Started и Trace Stopped)

Снимка

Profiler-a може да видите тук - цък

Едит: Paint ftw.


от kirov (4821 точки)


0
ако му дадеш .Include("Address.Town").Include("Department") на първа ще прави точно една заявка (четворен JOIN)

от staafl (5770 точки)

0
Мерси за съвета. Не съм гледал лекцията и не бях много сигурен как работи. Не знаех, че може за всяка таблица да се ползва.
Едит: Големи магии прави този EF. Не мога да разбера кое разбира(като синтаксис) и кое не. Май е най-сигурно да пробвам всичко. :D

от kirov (4821 точки)


0

Ето и задачата решена с OpenAccess за разнообразие, има някои малки разлики от Entity с любезното съдействие на vic.alexiev отново:)

https://github.com/Gerya/TelerikAcademy/tree/master/HomeWorks/Databases/8.EntityFrameworkPerformance


от Gerya (1079 точки)


0
https://github.com/vic-alexiev/TelerikAcademy/blob/master/Databases/Homework%20Assignments/8.%20Entity%20Framework%20Performance/01.%20EmployeeSelectorUsingOpenAccess/EmployeeSelectorUsingOpenAccess.cs
За пълнота. Задачите с Entity Framework и OpenAccess. Всъщност единствените разлики са в FetchStrategy-то, което се използва в OpenAccess вместо Include():
var strategy = new FetchStrategy();
strategy.LoadWith

от vic.alexiev (2299 точки)


0
Втора успях да я докарам до 1 query
var employeesFinal = db.Employees .Select(employee => new { Name = employee.FirstName + " " + employee.LastName, Address = employee.Address.AddressText, Town = employee.Address.Town.Name }) .Where(t => t.Town.Equals("Sofia")) .ToList();

от bstaykov (528 точки)


0
И аз да публикувам моите решения. Благодаря.
var db = new TelericacademyModel();
// 1.1.First Metod. //foreach (var emp in db.Employees.Include("Department").Include("Address.Town")) //{ // Console.WriteLine("{0} {1} {2}", // emp.FirstName, // emp.Department.Name, // emp.Address.Town.Name // ); //}
//1.2.Second Metod //var employees = db.Employees.Select(emp => // new { // Name= emp.FirstName, // Departament= emp.Department.Name, // Town = emp.Address.Town.Name // }); //foreach (var emp in employees) //{ // Console.WriteLine("{0} {1} {2}", emp.Name, emp.Departament, emp.Town // ); //} //2.0 var employees = db.Employees.Where(emp => emp.Address.Town.Name == "Sofia").Select( emp => new { Name = emp.FirstName + " " + emp.LastName, Address = emp.Address.AddressText, Towns = emp.Address.Town.Name, } ).ToList();
foreach (var emp in employees) { Console.WriteLine("{0}: {1} ---> {2}", emp.Name, emp.Address, emp.Towns); Console.WriteLine("------------------------------------------------------------"); }

от tototrade (0 точки)