Linq向实体滚动12个月的数据查询

时间:2012-01-21 07:14:51

标签: linq-to-entities

我有一个要求,我需要显示滚动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();

我需要fom中的数据 AppId,AppName,DataPoints = {所有12个月的数据} 如果一个月没有应用程序的数据..那么这个月应该计为0.但是我的查询只给出了应用数据存在的月份

例如,一个应用程序的数据仅为2011年12月..然后我需要数据点来保持2011年1月至2011年11月和2011年12月的数量。但是我目前的查询给出Datapoints仅保留2011年12月的数据。

1 个答案:

答案 0 :(得分:0)

问题是您在数据点选择的日期范围内进行过滤,这意味着您不会获得该范围之外的值的任何数据点。如果您直接在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() })
        )
});

我没有对此进行测试,因为我没有您的数据实体,所以如果我有一些输入错误,我会道歉。