Foreach и запрашивает вопрос улучшения производительности в C # - PullRequest
0 голосов
/ 03 мая 2018

У меня проблема с производительностью в моем коде.

Приведенный ниже метод используется для составления сравнительной оценки компаний из всей страны на основе некоторых правил:

public List<object> GetCNAEBRCycleChart(int VisitId)
    {
        List<object> result = new List<object>();


        Visit visit = Context.Visit.Find(VisitId);
        Company company = visit.Company;
        var CNAE = company.MainEconomicCNAE.IdentifyCNAE;

        string[] Themes = new string[5];

        Themes[0] = "Finance";
        Themes[1] = "Market";
        Themes[2] = "Organization";
        Themes[3] = "Planning";
        Themes[4] = "People";

        int count = 0;

        List<Visit> listVisitCNAECountry = (from vis in Context.Visit
                                            where vis.Company.MainEconomicCNAE.IdentifyCNAE.StartsWith(CNAE)
                                                && vis.Order == 1
                                             select vis
                                                ).ToList();

        double[] Values = new double[5];

        Values[0] = 0;
        Values[1] = 0;
        Values[2] = 0;
        Values[3] = 0;
        Values[4] = 0;

        foreach (var vis in listVisitCNAECountry)
        {
            count = 0;
            var visitIdCompany = vis.Id;

            var diagnostic = Context.Visit.Find(visitIdCompany).Diagnostic;

            if (diagnostic != null)
            {
                foreach (var itemTheme in Themes)
                {
                    var TemaAux = itemTema;
                    int QtQuestion = (from itemForm in Context.FormItem
                                        join tipo in Context.FormItemType on itemForm.FormItemTypeId equals tipo.Id
                                        join itemForm2 in Context.FormItem on itemForm.FormItemParentId equals itemForm2.Id
                                        join itemForm3 in Context.FormItem on itemForm2.FormItemParentId equals itemForm3.Id
                                        where itemForm3.Name == TemaAux && tipo.Name == "Pergunta"
                                        select itemForm
                                              ).Count();

                    var sumAnswerCompany = (from alter in Context.Alternative
                                            join itemForm in Context.FormItem on alter.FormItemId equals itemForm.Id
                                            join itemForm2 in Context.FormItem on itemForm.FormItemParentId equals itemForm2.Id
                                            join itemForm3 in Context.FormItem on itemForm2.FormItemParentId equals itemForm3.Id
                                            join answer in Context.Answer on itemForm.Id equals answer.FormItemId
                                            where answer.AlternativeId == alter.Id &&
                                            answer.DiagnosticId == diagnostico.Id && itemForm3.Name == TemaAux

                                            select alter.Value
                                    ).AsEnumerable().Sum();

                    double scoreCompany = //Some calculations

                    Values[count] += scoreCompany;
                    count++;
                }
            }
        }

        count = 0;

        foreach (var val in Values)
        {
            Values[count] = //more calculations
            count++;
        }

        var model = new { NameCategory = "CNAE in Country", Value1 = Values[0], Value2 = Values[1], Value3 = Values[2], Value4 = Values[3], Value5 = Values[4] };

        result.Add(model);

        return result;
    }

Проблема заключается в том, что с действующим CNAE список listVisitCNAECountry получает 16000+ элементов, которые обеспечивают ужасную производительность.

В моей локальной среде это занимает 30 минут +, и я даже не знаю, с чего начать, чтобы реально улучшить производительность.

Самая большая проблема заключается в том, что мне действительно нужны все эти итерации для правильных вычислений.

Если у кого-нибудь есть идеи, пожалуйста, помогите мне.

1 Ответ

0 голосов
/ 03 мая 2018

Первое, что нужно изменить:

                var sumAnswerCompany = ( /* complex query */
                                ).AsEnumerable().Sum();

Это плохо; вместо того, чтобы выдавать select sum(...) как запрос к базе данных, вместо этого ему придется выбрать столбец (столбцы) и вернуть все необходимые строки, что может составлять огромный объем полосы пропускания.

Вместо этого внесите сумму в базу данных и просто верните одно число:

                var sumAnswerCompany = ( /* complex query */
                                ).Sum();

Однако, честно говоря, я бы предложил написать все это в необработанном SQL, используя объединения и группировку из исходных данных. Иногда LINQ не ваш лучший инструмент.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...