按月和年计算活跃列表
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()}");
}
我目前正在处理房地产数据,每个 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()}");
}