按月和年计算活跃列表

Counting active listings by month and year

我目前正在处理房地产数据,每个 Listing 实体都有一个 ListingDate 和一个 CloseDate。我目前正在尝试做的是计算在给定月份和年份(按年份和月份分组)有多少列表处于活动状态。

例如,如果 Listing1 的 ListingDate 为 05/01/2020,CloseDate 为 08/01/2020,则 5 月、6 月、7 月和 8 月将有 1 个活跃计数,一年总计为4.

我正在使用 EF 和 LINQ,想知道我是否能以某种方式解决它。

如有任何帮助或建议,我们将不胜感激。

让我们假设日期是在 DateTime 结构中给出的。 (您可以将文本输入解析为 DateTime,check this)我们可以遍历包含 Listing 实体的列表,并执行检查以查看给定日期是否在 ListingDate 和 ClosingDate 的范围内。如果检查成功,将实体复制到另一个列表。

DateTime query = ...;
List<Listing> list = ...;
List<Listing> pass = new();

foreach (Listing entity in list)
{
    if (entity.ListingTime < query && query < entity.ClosingTime)
        pass.Add(entity)
}

在检查查询是否在范围内时,我们可以使用 DateTime.Compare(),但比运算符少 than/greater 会使语句更易于阅读。

当然可以;如果您将列表映射到它活跃的每个月,那么您可以简单地按月对结果进行分组并轻松获得计数。因此,最棘手的部分就是想出月份 DateTime 值,这并不那么棘手。

从开始日期和结束日期获取月份 DateTime 的扩展方法:

public static IEnumerable<DateTime> GetMonths(this DateTime startDate, DateTime endDate)
{
    var monthDiff = (endDate.Month - startDate.Month) + (12 * (endDate.Year - startDate.Year));
    var startMonth = new DateTime(startDate.Year, startDate.Month, 1);
    
    return Enumerable.Range(0, monthDiff + 1)
        .Select(i => startMonth.AddMonths(i));
}

创建查找:

var listingsByMonth = listings
    .SelectMany(l =>
        {
            return l.ListingDate.GetMonths(l.ClosingDate.AddDays(-1)) // assuming closing date is exclusive
                .Select(dt => new KeyValuePair<DateTime, Listing>(dt, l));
        })
    .ToLookup(kvp => kvp.Key, kvp => kvp.Value);

结果展示:

foreach(var g in listingsByMonth)
{
    Console.WriteLine($"{g.Key:yyyy-MM}: {g.Count()}");
}

Fiddle