C# Linq到实体组(按日期时间)

C# Linq到实体组(按日期时间),c#,linq,datetime,linq-to-entities,grouping,C#,Linq,Datetime,Linq To Entities,Grouping,我希望能够获得过去12个月的销售额,按月分组。以下是我目前掌握的情况: 类别定义: public DateTime DateSold { get; set; } public int Month { get; set; } public int USDNumberItemsSold { get; set; } public int GBPNumberItemsSold { get; set; } public in

我希望能够获得过去12个月的销售额,按月分组。以下是我目前掌握的情况:

类别定义:

        public DateTime DateSold { get; set; }
        public int Month { get; set; }

        public int USDNumberItemsSold { get; set; }
        public int GBPNumberItemsSold { get; set; }
        public int EURNumberItemsSold { get; set; }
        public int TotalNumberItemsSold { get { return USDNumberItemsSold + GBPNumberItemsSold + EURNumberItemsSold; } }

        public decimal USDRevenueTotal { get; set; }
        public decimal GBPRevenueTotal { get; set; }
        public decimal EURRevenueTotal { get; set; }
        public decimal OverallEarnings { get { return USDRevenueTotal + GBPRevenueTotal + EURRevenueTotal; } }
我的Linq查询如下:

List<MonthlySales> monthlySales = (from sale in Sales
                                   orderby sale.DateSold descending
                                   group sale by sale.DateSold.Month into ds
                                   select new MonthlySales
                                   {
                                       DateSold = ds.Key,
                                       USDNumberItemsSold = ds.Where(it => it.USDCut.HasValue).Where(it => it.USDCut != 0).Count(),
                                       GBPNumberItemsSold = ds.Where(it => it.GBPrCut.HasValue).Where(it => it.GBPCut != 0).Count(),
                                       EURNumberItemsSold = ds.Where(it => it.EURCut.HasValue).Where(it => it.EURCut != 0).Count(),
                                       USDRevenueTotal = PerformCurrencyConversion(ds.Sum(it => it.USDCut.HasValue ? it.USDCut.Value : 0), 0M, 0M, reportRequest.BaseCurrency, endDate),
                                       GBPRevenueTotal = PerformCurrencyConversion(0M, ds.Sum(it => it.GBPCut.HasValue ? it.GBPCut.Value : 0), 0M, reportRequest.BaseCurrency, endDate),
                                       EURRevenueTotal = PerformCurrencyConversion(0M, 0M, ds.Sum(it => it.EURCut.HasValue ? it.EURCut.Value : 0), reportRequest.BaseCurrency, endDate),
                        }).Take(12).ToList();
其中'Month'是一个整数。这是可以的,但出于显示目的,我没有年份或类似的内容

有人能提供一些建议吗


谢谢

我的建议是将关键点设置为所讨论的月份的第一个月,这样您就可以同时获得年份信息(因为您需要最后12个月的信息)


您还希望在分组之后而不是之前进行排序,因为分组使用键的散列而不是值,因此您可能无法获得相同的排序。

我建议将键设置为所讨论的月份的第一个,这样您还可以显示年份信息(这是您需要的,因为您需要过去12个月的时间)


您还希望在分组之后而不是之前进行排序,因为分组使用键的散列而不是值,因此您可能无法获得相同的排序。

为什么不按日期时间分组,这样您就可以使用«ds.Key»设置«datesell»。

如果您想在注册表项中存储日期时间的月份,您可以只使用«ds.Key.Month»。

为什么不按日期时间分组,这样您就可以使用«ds.Key»设置«datesell»。

如果您想在键中存储DateTime的月份,可以只使用«ds.Key.Month»。

如果您需要,我建议引入一个新类型来表示
YearMonth
(请参见注释中的问题)

顺便说一句:如果您仅按月份分组,那么在获得重叠数据时可能会出现问题,例如,数据集包含
201101
201201
的数据-这两个数据都将分组在一起。当您按年/月分组时,这应该不是问题

新类型将非常基本(可以是结构):

MonthlySales将获得此属性:

public YearMonthSold DateSold { get; set; }
LINQ查询需要更新才能使用它:

List<MonthlySales> monthlySales = (from sale in Sales
                        orderby sale.DateSold descending
                        group sale by new {Year = sale.DateSold.Year, Month = sale.DateSold.Month} into ds
                        select new MonthlySales
                        {
                            DateSold = new YearMonthSold {Year = ds.Key.Year, Month = ds.Key.Month},
                            (...)
                        })
                       .Take(12)
                       .ToList();
List monthlySales=(来自销售中的销售
orderby sale.datesalled
按新{Year=sale.dateselled.Year,Month=sale.dateselled.Month}分组销售到ds中
选择新月刊
{
DateSeld=new Year monthsold{Year=ds.Key.Year,Month=ds.Key.Month},
(...)
})
.Take(12)
.ToList();
编辑: 或者按照SPFiredrake的建议:

List<MonthlySales> monthlySales = (from sale in Sales
                        orderby sale.DateSold descending
                        group sale by new YearMonthSold {Year = sale.DateSold.Year, Month = sale.DateSold.Month} into ds
                        select new MonthlySales
                        {
                            DateSold = ds.Key,
                            (...)
                        })
                       .Take(12)
                       .ToList();
List monthlySales=(来自销售中的销售
orderby sale.datesalled
按新年月份分组销售将{Year=sale.dateselled.Year,Month=sale.dateselled.Month}分为ds
选择新月刊
{
datesell=ds.Key,
(...)
})
.Take(12)
.ToList();

我不知道
Sale
对象的代码,但它似乎不应该受到此更改的任何影响。

如果您需要的话,我建议引入一个新类型来表示
YearMonth
(请参阅我在评论中的问题)

顺便说一句:如果您仅按月份分组,那么在获得重叠数据时可能会出现问题,例如,数据集包含
201101
201201
的数据-这两个数据都将分组在一起。当您按年/月分组时,这应该不是问题

新类型将非常基本(可以是结构):

MonthlySales将获得此属性:

public YearMonthSold DateSold { get; set; }
LINQ查询需要更新才能使用它:

List<MonthlySales> monthlySales = (from sale in Sales
                        orderby sale.DateSold descending
                        group sale by new {Year = sale.DateSold.Year, Month = sale.DateSold.Month} into ds
                        select new MonthlySales
                        {
                            DateSold = new YearMonthSold {Year = ds.Key.Year, Month = ds.Key.Month},
                            (...)
                        })
                       .Take(12)
                       .ToList();
List monthlySales=(来自销售中的销售
orderby sale.datesalled
按新{Year=sale.dateselled.Year,Month=sale.dateselled.Month}分组销售到ds中
选择新月刊
{
DateSeld=new Year monthsold{Year=ds.Key.Year,Month=ds.Key.Month},
(...)
})
.Take(12)
.ToList();
编辑: 或者按照SPFiredrake的建议:

List<MonthlySales> monthlySales = (from sale in Sales
                        orderby sale.DateSold descending
                        group sale by new YearMonthSold {Year = sale.DateSold.Year, Month = sale.DateSold.Month} into ds
                        select new MonthlySales
                        {
                            DateSold = ds.Key,
                            (...)
                        })
                       .Take(12)
                       .ToList();
List monthlySales=(来自销售中的销售
orderby sale.datesalled
按新年月份分组销售将{Year=sale.dateselled.Year,Month=sale.dateselled.Month}分为ds
选择新月刊
{
datesell=ds.Key,
(...)
})
.Take(12)
.ToList();

我不知道
Sale
对象的代码,但它似乎不应该受到此更改的任何影响。

我认为它不在Sale.datesell.Month中。我猜它在您的performCurrencyConversion方法中,但如果没有堆栈跟踪,我无法确定。您将使用该日期做什么?我问的原因是您正在将日期设置回销售日期。但是,如果日期是前一年的日期,会发生什么情况?您是否尝试
datesell=new DateTime(DateTime.Now.year,ds.Key,1)
来解决此错误?(但您应该确保只获得过去12个月的资料。)DateSell是DateTime类型的目的是什么?您希望基于分组设置此属性,因此我希望您可以获得各种日期(如果您完全使用这些日期,则可能是时间)在您的分组中。除非您只需要yearMonth,否则在这种情况下,我会创建一个结构来保存此信息,以使目的更清楚。我认为它不在sale.datesall.Month中。我猜它在您的性能中