LINQ左外联接日期不起作用

时间:2016-02-06 07:36:18

标签: c# linq

我有GroupedResult

的这个集合
IQueryable<GroupedResult> groupedResult = from p in db.Departure
group p by new { p.Terminal, p.DepartureDate, p.DepartureDate.Month } into g
select new GroupedResult
{
  terminal = g.Key.Terminal.Code,
  date = g.Key.DepartureDate,
  distance = g.Count(),
  month = g.Key.Month
};

问题是我得到的收藏品有一些日期丢失。例如db.Departure包含2月1日,2日,4日和6日。我还想在2月3日和5日显示GroupedResult所以我使用以下代码创建从特定开始开始的日期集合日期:

var dates = new List<DateTime>();

for (var dt = date; dt <= DateTime.Now; dt = dt.AddDays(1))
{
    dates.Add(dt);
}

然后将dates加入groupedResult

var result = from p in groupedResult.ToList()
from q in dates.Where(r => r == p.date).DefaultIfEmpty()
select p;

我得到的结果与groupedResult的结果相同。 如何显示没有日期数据的条目?

2 个答案:

答案 0 :(得分:3)

这是因为你在最后选择P ......你必须创建新的匿名类

var result = from q in dates
join p in groupedResult.ToList() on q equals p.date into joinedResult
from r in joinedResult.DefaultIfEmpty()
select new
{
terminal = r==null?null:r.terminal,
  date = q,
  distance = r==null?null:r.distance,
  month = r==null?null:r.month
};

答案 1 :(得分:2)

var result = from p in groupedResult.ToList()
from q in dates.Where(r => r == p.date).DefaultIfEmpty()
select p;

你左边的连接错误。您正在从groupedResult中选择所有项目,然后让LINQ获取所有日期 - 如果没有,则请求所有日期 - 与groupedResult中已存在的日期相匹配。

var result = from q in dates
             from p in groupedResult.Where(r => r.date == q).DefaultIfEmpty()
             select new { Date = q, Items = p };

这样可行,因为您选择所有日期并搜索匹配的分组项目。