2012-11-29 39 views
1

我有以下EF查询,它只返回数据库中存在的日期的使用情况数据列表。EF lambda表达式中的左外连接

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与数据点的不间断日期顺序返回一个列表在DB不存在的日期,所以我试图做一个左外连接与日期下面的列表中,但可以“不像是会得到它的权利:

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; 
} 

回答

3

如果我正确理解和DateTime是否名单是的加入外部分,你可以使用join into条款执行left outer join

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(); 
+0

Thanks @ risky-martin!几乎就是这样。我希望日期返回PerfData列表,而不是匿名类型。类似于 'var日期=从GetDateRange中的日期(开始,结束) 加入dailyUsage在每日使用日期等于dailyUsage.Date到grp 选择新的PerData {Date = date,Transfers = dailyUsage.Transfers,Exists = dailyUsage.Exists ,Duration = dailyUsage.Duration};' – yqit

+0

@yqit:这与最初的dailyUsages List有什么不同?没有PerDatas的日期应该发生什么? –

+0

原始列表只包含DB中存在的日期。我希望列出所有日期之间的开始和结束日期,其中“转账= 0,存在= 0,持续时间= 0”的日期不在数据库中。我不确定我是否解释得很好。 – yqit