Подсчет двух таблиц на основе дат - PullRequest
0 голосов
/ 10 сентября 2018

У меня есть две таблицы Регистры и IAApplications , как показано ниже

Регистры

Name                                   Email                           Creationdate
Mazhar                                Khan@gmail.com              2018-09-02 13:08:32.303
mohan                                 m@gmail.com                 2018-09-01 13:08:32.303
kjdj                                  k@gmail.com                 2018-09-01 13:08:32.303

IAApplications

Title                Sector                   SubmissionDate
 kk                     jj                  2018-09-03 13:08:32.303 
 kk                     jj                  2018-09-02 13:08:32.303 
 mm                     tt                  2018-09-01 13:08:32.303

Мне нужен вывод ниже для моего отчета

Date            New Registratio          New Application   
09-03-2018         0                         1
09-02-2018         1                         1             
09-01-2018         2                         1   

Я пробовал ниже код получить неправильные данные

  var Regs = from o in db.Registers
                   select new { A = (o.Creationdate) };
        var Apps = from c in db.IAApplications
                   select new { A = (c.SubmissionDate) };


        var result = (from x in Regs.Concat(Apps)
                      group x by x.A into og
                      select new { Date = og.Key, Reg = og.Count(), App = og.Count() }).ToList();  

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

enter image description here

Я знаю, что что-то не так в моем запросе, поэтому дата не показывает группировку, а также количество данных

Я предпочитаю этот пример .

Ответы [ 2 ]

0 голосов
/ 10 сентября 2018

Задача может быть решена с помощью одного обращения в БД:

var regCounts = db.Registers.GroupBy(reg => DbFunctions.TruncateTime(reg.Creationdate),
    (key, group) => new { Date = key, Value = group.Count() });

var appCounts = db.IAApplications.GroupBy(app => DbFunctions.TruncateTime(app.SubmissionDate),
    (key, group) => new { Date = key, Value = group.Count() });

var leftJoin = regCounts.SelectMany(reg => appCounts.Where(app => app.Date == reg.Date).DefaultIfEmpty(),
    (reg, app) => new { reg.Date, RegCount = reg.Value, AppCount = app != null ? app.Value : 0 });

var rightJoin = appCounts.SelectMany(app => regCounts.Where(reg => reg.Date == app.Date).DefaultIfEmpty(),
    (app, reg) => new { app.Date, RegCount = reg != null ? reg.Value : 0, AppCount = app.Value });

var data = leftJoin.Union(rightJoin) // "full join" regCounts and appCounts
    .OrderByDescending(r => r.Date)
    .ToArray();

К сожалению, LINQ To Entities не поддерживает полное внешнее соединение, но его можно смоделировать как объединение левого внешнего и правого внешнего соединения, как показано выше.

0 голосов
/ 10 сентября 2018

Обычно у вас должны быть фильтры dateStart и dateEnd

Затем для каждой даты в этом диапазоне вы проверяете, есть ли регистрация или заявка на указанную дату

var dateStart = new DateTime(2018,9,1);
var dateEnd = DateTime.Now;
var list = new List<Tuple<DateTime, int, int>>(); // structure to store DateTime, New Registratio, New Application   
for(var i = dateStart; i.Date <= dateEnd.Date;  i = i.AddDay(1))
{
    list.Add(Tuple.Create(i,
                          db.Registers.Count(r => r.Creationdate.Date == i.Date), 
                          db.IAApplications.Count(r => r.SubmissionDate.Date == i.Date)));
}
var result = list.Select(og => new { Date = og.Item1, Reg = og.Item2, App = og.Item3 }).ToList();

Если у вас нет предопределенных значений dateStart и dateEnd, эти значения поступают из min/max из 2 таблиц

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