如何选择按月分组的行 所以我有一个实体:
public class Security
{
public Guid Id { get; set; }
public string Name { get; set; }
public string Quatation { get; set; }
public SecurityType SecurityType { get; set; }
public double Denomination { get; set; }
public CurrencyType DemoniationType { get; set; }
public virtual ICollection<ReportPeriod> ReportPeriods { get; set; }
}
报告期间实体:
public class ReportPeriod
{
public Guid Id { get; set; }
public DateTime Start { get; set; }
public DateTime End { get; set; }
public Guid SecurityId { get; set; }
public Guid StockExchangeId { get; set; }
public double Amount { get; set; }
public virtual Security Security { get; set; }
}
因此,我需要以某种方式获取ReportPeriod一年中每月的一般金额。有没有人有一些想法怎么做?
答案 0 :(得分:1)
你想要一般的月份金额。
Dictionary<DateTime, double>
格式,其中Key
是第一个月的日期(我们在Value
中有一般金额的月份)。start
和end
的范围并不适用于该月。在Security
课程中添加此媒体资源。
public Dictionary<DateTime, double> AmountGroupedByMonth
{
get
{
Dictionary<DateTime, double> table = new Dictionary<DateTime, double>();
if (ReportPeriods != null && ReportPeriods.Count > 0)
{
ReportPeriod frtReportPeriod = ReportPeriods.First();
DateTime monthStDt =
new DateTime(frtReportPeriod.Start.Year, frtReportPeriod.Start.Month, 1);
double groupedAmount = 0;
foreach (ReportPeriod reportPeriod in ReportPeriods)
{
//Checking if this report should be grouped with pervious report or not
if (monthStDt.Year == reportPeriod.Start.Year
&& monthStDt.Month == reportPeriod.Start.Month)
{
groupedAmount += reportPeriod.Amount;
}
else
{
//if we find that this report is of different month.
table.Add(monthStDt, groupedAmount);
groupedAmount = reportPeriod.Amount;
monthStDt =
new DateTime(reportPeriod.Start.Year, reportPeriod.Start.Month, 1);
}
}
if (groupedAmount != 0 && !table.ContainsKey(monthStDt))
table.Add(monthStDt, groupedAmount);
}
return table;
}
}
通过添加此属性,可以轻松地将月份分组数据用于Security
的对象。而且,由于它没有存储在任何变量中,因此在使用之前不需要更新(或生成)。只需调用此属性,它将使用最新的可用数据计算月份的一般金额。
Security s = new Security();
DateTime nowDate = DateTime.Now;
s.ReportPeriods = new List<ReportPeriod>();
for(int i = 0; i <= 70; i = i + 5)
{
s.ReportPeriods.Add(new ReportPeriod(nowDate.AddDays(i), nowDate.AddDays( i + 3), 200 ));
}
Dictionary<DateTime, double> AmountGroupedByMonth = s.AmountGroupedByMonth;
输出将如下:
答案 1 :(得分:1)
我们可以使用LINQ来做到这一点。请在C#中找到以下代码段。希望能帮助到你。在这里,我们按年份和月份进行分组,然后总结金额。
namespace Solutions
{
using System;
using System.Collections.Generic;
using System.Linq;
public class Security
{
public Guid Id { get; set; }
public string Name { get; set; }
public string Quatation { get; set; }
//public SecurityType SecurityType { get; set; }
public double Denomination { get; set; }
//public CurrencyType DemoniationType { get; set; }
public virtual ICollection<ReportPeriod> ReportPeriods { get; set; }
}
public class ReportPeriod
{
public Guid Id { get; set; }
public DateTime Start { get; set; }
public DateTime End { get; set; }
public Guid SecurityId { get; set; }
public Guid StockExchangeId { get; set; }
public double Amount { get; set; }
public virtual Security Security { get; set; }
}
public class Entities
{
public static void Main(string[] args)
{
Security security = new Security()
{
Id = Guid.NewGuid(),
Denomination = 1,
Name = "A",
Quatation = "Z",
ReportPeriods = new List<ReportPeriod>()
};
security.ReportPeriods.Add(new ReportPeriod()
{
Amount = 10,
Security = security,
SecurityId = security.Id,
End = DateTime.Now.AddDays(1),
Start = DateTime.Now,
Id = Guid.NewGuid(),
StockExchangeId = Guid.NewGuid()
});
security.ReportPeriods.Add(new ReportPeriod()
{
Amount = 5,
Security = security,
SecurityId = security.Id,
End = DateTime.Now.AddDays(1),
Start = DateTime.Now,
Id = Guid.NewGuid(),
StockExchangeId = Guid.NewGuid()
});
security.ReportPeriods.Add(new ReportPeriod()
{
Amount = 5,
Security = security,
SecurityId = security.Id,
End = DateTime.Now.AddDays(1),
Start = DateTime.Now.AddMonths(-1),
Id = Guid.NewGuid(),
StockExchangeId = Guid.NewGuid()
});
foreach (var groupedReportValues in security.ReportPeriods
.GroupBy(period => new { period.Start.Year, period.Start.Month }).Select(
groupedOnMonth => new
{
StartYear = groupedOnMonth.Key.Year,
StartMonth = groupedOnMonth.Key.Month,
AmountSum = groupedOnMonth.Sum(reportValue => reportValue.Amount)
}))
{
Console.WriteLine(groupedReportValues.StartYear);
Console.WriteLine(groupedReportValues.StartMonth);
Console.WriteLine(groupedReportValues.AmountSum);
Console.WriteLine();
}
Console.ReadLine();
}
}
}