Entity Framework - Отдельные аспекты - Оптимизация производительности - PullRequest
1 голос
/ 11 апреля 2020

Предположим, у нас сложный сгенерированный запрос ...

IQueryable<...> query = ... //something complex

А затем я хотел бы вернуть несколько "граней", и моя текущая реализация ...

        var facets = new 
        {
            Countries = query.Select(r => new { Id = r.CountryId, Name = r.Country.Name })
                .Distinct().ToList(),
            Regions = query.Select(r => new { Id = r.RegionId, Name = r.Region.Name })
                .Distinct().ToList(),
            ... //7 more facets
        };

В этой реализации у меня 9 ToList (), поэтому у меня было бы 9 дБ запросов, и так как «запрос» довольно сложный, это вызывает некоторые проблемы с производительностью. Есть ли возможность реализовать это с EF и одним запросом БД?

Обновление: EF Core версия 3.1

1 Ответ

1 голос
/ 12 апреля 2020

В настоящее время (EF Core 3.1) невозможно достичь желаемой формы результата с помощью одного запроса к базе данных.

Однако вы можете попытаться получить все (отдельные) данные, необходимые с помощью одного запроса к базе данных, в памяти а затем получить «грани», используя LINQ to Objects. В основном разделение запроса по оценке сервера и клиента, что в EF Core 3.0 было неявным, а в EF Core 3.0+ должно быть явным.

например

var data = query.Select(r => new 
{
    Country = new { Id = r.CountryId, Name = r.Country.Name }, // facet 1 data
    Region = new { Id = r.RegionId, Name = r.Region.Name }, // facet 2 data
    //... 7 more facets 
})
.Distinct() // with or w/o this depending on query performance vs result set size
.ToList();

var facets = new 
{
    Countries = data.Select(r => r.Country).Distinct().ToList(), // facet 1
    Regions = data.Select(r => r.Region).Distinct().ToList(), // facet 2
    //... 7 more facets
};
...