Linq для лиц, переходящих 12-месячный запрос данных - PullRequest
1 голос
/ 21 января 2012

У меня есть требование, где мне нужно отобразить данные за 12 месяцев. Ниже приведен мой запрос

 var lt = (from a in apps
    select new
    {
     AppId = a.Id,
     AppName = a.Name,
    DataPoints = (from e in errs join ei in errInstances on e.Id equals ei.ErrorId
    where (e.ApplicationId == a.Id && ei.stampUTC >= startDate && ei.stampUTC <= endDate)
    group ei by new { ei.stampUTC.Month, ei.stampUTC.Year } into grp
    select new { Year = grp.Key.Year, Month = grp.Key.Month, Count = grp.Count() }).OrderBy(y => y.Year)    }).ToArray();

Мне нужны данные в форме AppId, AppName, DataPoints = {данные всех 12 месяцев} вдля случая за месяц нет данных для приложения. затем месяц должен прийти с числом 0. Но мой запрос дает мне только месяцы, для которых существуют данные приложения

Например, приложение имеет данные только длядекабрь 2011 г., затем мне нужно, чтобы точки данных содержали 0 с за январь 2011 г. до ноября 2011 г. и количество декабрь 2011 г. Но мой текущий запрос дает точкам данных данные только за декабрь 2011 г.

1 Ответ

0 голосов
/ 28 января 2012

Проблема заключается в том, что вы делаете фильтр для диапазона дат в выборе точек данных, что означает, что вы не получите никаких точек данных для значений за пределами этого диапазона.Если бы вы делали это непосредственно в SQL, вам пришлось бы использовать табличную переменную (или какую-либо другую временную таблицу или коллекцию диапазонов дат), а затем выполнить левое соединение с этими ошибками, чтобы получить список, содержащий нулевые значенияправая сторона вашего соединения.Я предполагаю, что у вас нет таблицы в SQL, для которой вы ведете соединение.Если нет, вот что я бы посоветовал попробовать (это не очень эффективно, но это решает вашу проблему):

var today = DateTime.Today;
var beginningOfCurrentMonth = DateTime.Now.AddDays(-(today.Day - 1));
// get list of previous 12 month date ranges
var dateRanges = new List<List<DateTime>>();
for (int i = 0; i < 12; i++)
    dateRanges.Add(new List<DateTime>() { today.AddMonths(-i), today.AddMonths(-i + 1) });
// get your apps
var appList = from a in apps
                select new
                {
                    AppId = a.Id,
                    AppName = a.Name
                }.ToList();
// get final list by looping through each app...
var finalList = appList.Select(app => new
{
    AppId = app.AppId,
    AppName = app.AppName,
    // and then loop through each date range value and do a select to get data poitn information.
    DataPoints = dateRanges.Select(dateRange =>
    (from e in errs
        join ei in errInstances on e.Id equals ei.ErrorId
        where (e.ApplicationId == app.AppId && ei.stampUTC >= dateRange[0] && ei.stampUTC < dateRange[1])
        group ei by new { ei.stampUTC.Month, ei.stampUTC.Year } into grp
        select new { Year = grp.Key.Year, Month = grp.Key.Month, Count = grp.Count() })
        )
});

Я не проверял это, так как у меня нет ваших сущностей данных,поэтому я прошу прощения, если у меня есть некоторые ошибки при печати. ​​

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