@sergeyiljin

Как увеличить производительность Entity Framework Core?

Раньше писал так:
var users = db.Users.ToList();
Затем стал писать так:
var users = db.Users.FromSql("SELECT * FROM Users").ToList();

После начал использовать хранимые процедуры:
CREATE PROCEDURE [dbo].[GetPhonesByCompany]
    @name nvarchar(50) 
AS
    SELECT * FROM Phones 
    WHERE CompanyId=(SELECT Id FROM Companies WHERE Name=@name)
GO

using(ApplicationContext db = new ApplicationContext())
{
    System.Data.SqlClient.SqlParameter param = new System.Data.SqlClient.SqlParameter("@name", "Samsung");
    var phones = db.Phones.FromSql("GetPhonesByCompany @name", param).ToList();
    foreach (var p in phones)
        Console.WriteLine($"{p.Name} - {p.Price}");
}

Но производительность не намного увеличилась.Что ещё мне можно сделать для увеличения производительности, используя EF Core?
  • Вопрос задан
  • 315 просмотров
Решения вопроса 2
hePPer
@hePPer
для неизменяемых выборок отключай трекинг сущностей
Ответ написан
@kttotto
все, что .NET
При таких запросах нет большой разницы в производительности, напишете Вы так
db.Users.ToList(); или вынесите в хранимку.

Но, если Вы запросы действительно так пишете db.Users.ToList(), то Вам никакие хранимки не помогут, т.к. в подобном примере Вы всю таблицу с тысячами пользователей вытягиваете в память. А если таблица еще и широкая, то просадка по ресурсам обеспечена. Вытягивать нужно только те поля, которые Вам нужны и по макимальному ограничению.

Профилировать и оптимизировать надо сложные запросы, где у Вас куча джойнов со всякими условиями и подзапросами. В последних версиях EF стал непредсказуем, если он не может linq смапить в sql, то он разобьет запрос на части и промежуточную фильтрацию сделает в памяти, он запросто может вытянуть всю таблицу, чтобы в памяти отфильтровать по какому то полю. Поэтому что-то сложнее однотабличной выборки, надо обязательно смотреть что за запрос EF шлет к бд, возможно сделать запрос обычным sql будет эффективнее.
Ну и для просвещения
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
@asd111
Тормозит из за того что вы создаете 1000 объектов user. Если нужна скорость то обрабатывайте на стороне БД с помощью SQL.
Ответ написан
@BashkaMen
C# программист
Если уже пишите sql попробуйте Dapper
https://metanit.com/sharp/articles/mvc/dapper.php
Ответ написан
lexxpavlov
@lexxpavlov
Программист, преподаватель
https://blog.oneunicorn.com/2017/09/25/many-to-man...

В EF Core (пока) нельзя связывать многие-ко-многим, и приходится использовать с промежуточной таблицей, которую нужно явно указывать:
var users = context.Users
            .Include(u => u.UserRoles)
            .ThenInclude(ur => ur.Role)
            .ToList();
// Теперь у юзера есть список UserRole с указанными ролями

foreach (var man in users.Select(u => u.UserRoles.Select(ur => ur.Role).Where(r => r.Name == "Man")))
{
    
}
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
MDO Москва
от 120 000 до 160 000 руб.
Созвездие Санкт-Петербург
от 40 000 до 55 000 руб.
Hunt4You Севастополь
от 60 000 до 120 000 руб.
22 апр. 2019, в 15:21
500 руб./за проект
22 апр. 2019, в 15:05
20000 руб./за проект
22 апр. 2019, в 14:54
7000 руб./за проект