@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?
  • Вопрос задан
  • 213 просмотров
Решения вопроса 2
hePPer
@hePPer
для неизменяемых выборок отключай трекинг сущностей
Ответ написан
@kttotto
все, что .NET
При таких запросах нет большой разницы в производительности, напишете Вы так
db.Users.ToList(); или вынесите в хранимку.

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

Профилировать и оптимизировать надо сложные запросы, где у Вас куча джойнов со всякими условиями и подзапросами. В последних версиях EF стал непредсказуем, если он не может linq смапить в sql, то он разобьет запрос на части и промежуточную фильтрацию сделает в памяти, он запросто может вытянуть всю таблицу, чтобы в памяти отфильтровать по какому то полю. Поэтому что-то сложнее однотабличной выборки, надо обязательно смотреть что за запрос EF шлет к бд, возможно сделать запрос обычным sql будет эффективнее.
Ну и для просвещения
Ответ написан
Пригласить эксперта
Ответы на вопрос 4
@sergeyiljin Автор вопроса
db.Users.ToList()
Дело в том, что мне как раз и нужно получить всех пользователей (1000 или больше, не важно) со всеми их свойствами.А также вложенными свойствами.
возможно сделать запрос обычным sql будет эффективнее

Я делал так.
var users = db.Users.FromSql("SELECT * FROM Users").ToList();

Разницы не заметил.
Ответ написан
@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")))
{
    
}
Ответ написан
Ваш ответ на вопрос

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

Войти через TM ID
Похожие вопросы
SLC7 Екатеринбург
от 50 000 до 90 000 руб.
LC Group Новосибирск
от 90 000 до 160 000 руб.
22 янв. 2019, в 17:36
600 руб./за проект
22 янв. 2019, в 17:30
100 руб./за 1000 зн.
22 янв. 2019, в 17:26
100000 руб./за проект