1

我有以下 EF 查询,它仅返回数据库中存在的日期的使用数据列表。

var DailyUsage = context.UsageData.Where(u => u.UserID == CurrentUser.ID && u.Date >= Start && u.Date <= End)
                                  .Select(p => new PerfData
    {
        Date = p.Date,
        Transfers = p.Transfers,
        Exists = p.Exists,
        Duration = p.Duration
    }).ToList();

我希望它返回一个包含不间断日期序列的列表,其中数据点为 0,表示数据库中不存在的日期,所以我尝试使用以下日期列表进行左外连接,但似乎无法正确:

public static List<DateTime> GetDateRange(DateTime startingDate, DateTime endingDate)
{
    if (StartingDate > EndingDate)
    {
        return null;
    }
    List<DateTime> rv = new List<DateTime>();
    DateTime tmpDate = startingDate;
    do
    {
        rv.Add(tmpDate);
        tmpDate = tmpDate.AddDays(1);
    }
    while (tmpDate <= endingDate);
    return rv;
}
4

1 回答 1

3

如果我理解正确并且 DateTimes 列表是联接的外部部分,则可以使用该join into子句执行左外部联接

var dailyUsages = context.UsageData
     .Where(u => u.UserID == CurrentUser.ID &&
                 u.Date >= start && 
                 u.Date <= end)
     .Select(p => new PerfData()
                  {
                      Date = p.Date,
                      Transfers = p.Transfers,
                      Exists = p.Exists,
                      Duration = p.Duration
                  }).ToList();

var dates = (from date in GetDateRange(start, end)
             join dailyUsage in dailyUsages on date equals dailyUsage.Date into grp
             from item in grp.DefaultIfEmpty(new PerfData()
                                             {
                                                 Date = date,
                                                 Transfers = 0,
                                                 Exists = 0,
                                                 Duration = 0
                                             })
             select item).ToList();
于 2012-11-29T05:19:44.477 回答