LINQ 在日期左外联接不起作用

本文关键字:不起作用 日期 LINQ | 更新日期: 2023-09-27 18:33:31

我有这个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
};

问题是我得到的收藏缺少一些日期。例如数据库。出发包含 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的结果相同.如何显示没有日期数据的条目?

LINQ 在日期左外联接不起作用

这是因为您在最后选择了 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
};
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 };

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