ASP. NET MVC LINQ GroupBy отличается от SQL Server GroupBy? - PullRequest
0 голосов
/ 17 апреля 2020

Linq rook ie здесь.

У меня есть SQL Серверная база данных, откуда поступают все необработанные данные для сварщиков. 17 сварщиков по номерам. У них свой процент KPI за каждый день (несколько заданий в день) в 1 смену.

У меня есть такие данные, как

Welder ID        KPI        Date
480              80         2020-04-01
94               60         2020-04-01
480              65         2020-04-02
94               78         2020-04-02
480              95         2020-04-03
94               90         2020-04-03

Expecting 
Welder ID        AvgKPI
480              80
94               76

Это можно легко сделать в SQL, изображение здесь = > https://imgur.com/a/un0jCTc Верхняя таблица результатов первого выбора взята из таблицы «raw» basi c, а нижняя таблица результатов соответствует ожидаемым в Linq, но не SQL.

У меня есть страница отчета (ASP. NET MVC5. NET Framework)
Контроллер

public ActionResult Records(DateTime? start, DateTime? end, string search = "")
if (start == null)
            {
                start = new DateTime(2019, 01, 02);
            }
            if (end == null)
            {
                end = new DateTime();
                end = DateTime.Now;
            };

SiempelLinkedServerEntities db = new SiempelLinkedServerEntities();
            List<ChecksSovaSiempelZak> chartData = db.ChecksSovaSiempelZaks
                                                                                  //base code generating the full list based on parameters 
                .Where(x => x.welderID.Contains(search))                         //  with DateTime? start, DateTime? end, string search=""
                .Where(t => t.Date >= start & t.Date <= end)
                .ToList();



            var dataSet = chartData.Select(k => new { k.welderID, k.welderKPI })
                                    .Distinct()
                                    .GroupBy(x => new { x.welderID}, (key, group) => new
                                    {
                                        IDwelder = key.welderID,
                                        KPIwelder = group.Average(x=>x.welderKPI)
                                    }).ToList();

            var welders = dataSet.Select(x => x.IDwelder);
            var weldersKPI = chartData.Select(x => x.KPIwelder);



            ViewBag.welders = welders;
            ViewBag.weldersKPI = weldersKPI;

Есть форма с 3 фильтрами, возвращаются параметры начала и конца DateTime предопределенные значения. Другой фильтр сделан для поиска строки для указанного c человека. Не уверен, что мой бэкэнд-подход правильный. Ожидается, что, если не задано никакого определенного c персона (строка поиска), вернет все строки на основе параметров даты и времени, как предопределено. Эти данные собираются посмотреть на диаграмму. Диаграмма не показывает среднее значение вообще. Страница отчета здесь => https://imgur.com/a/DILnLI6 Левая сторона страницы хорошая и правильная. Отображение списка указанных c человек или лиц в выбранный период. Как исправить контроллер для передачи данных в Viewbag, как ожидается на SQL Server? Средние значения являются динамическими c (выбранный период из параметров datetime).

Короче говоря, я хочу передать данные на график, например, ось X = список ID сварщика и ось Y = список среднего значения для каждого Сварщик на основе выбранного периода.

Любой совет более чем приветствуется. Прошу прощения за мой английский sh, если что-то указано плохо

Ответы [ 2 ]

0 голосов
/ 18 апреля 2020

Поскольку вся база данных и модель базы данных не относятся к моей сфере деятельности, я заметил, что в таблицах, которые я использую в выражениях, не заданы первичные и внешние ключи. Добавление .AsNoTracking () решило проблему!

SiempelLinkedServerEntities db = new SiempelLinkedServerEntities();
            List<ChecksSovaSiempelZak> chartData = db.ChecksSovaSiempelZaks
                .AsNoTracking()                                                            
                .Where(x => x.welderID.Contains(search))                         
                .Where(t => t.Date >= start & t.Date <= end)
                .ToList();
0 голосов
/ 17 апреля 2020

Если я правильно понял, я думаю, что вы хотели бы изменить эту строку

            var weldersKPI = chartData.Select(x => x.KPIwelder);

на var weldersKPI = dataSet.Select(x => x.KPIwelder);

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