1

DB に存在する日のみの使用状況データのリストを返す次の 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();

DBに存在しない日付のデータポイントが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 に答える