0

我希望能够获得过去 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();

我收到以下错误:

无法将类型“int”隐式转换为“System.DateTime”

因为显然 DateTime.Now.Month 是一个整数。

我尝试使用以下内容:

Month = ds.Key

其中“月份”是一个整数。这没关系,但出于显示目的,我没有年份或类似的东西。

任何人都可以提供任何建议吗?

谢谢。

4

3 回答 3

1

我建议将密钥设置为相关月份的第一天,这样您还可以获得年份信息(因为您想要过去 12 个月,所以您需要这些信息)。

...
group sale by sale.DateSold.Date.AddDays(-(sale.DateSold.Day - 1)) into ds
orderby ds.Key descending
...

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

于 2012-05-15T14:05:08.130 回答
1

你为什么不按日期时间分组,这样你就可以用«ds.Key»设置«DateSold»。
如果您想将 DateTime 的月份存储在 Key 中,您只需« ds.Key.Month »。

于 2012-05-15T14:59:56.303 回答
1

我建议引入一种新类型来表示YearMonth这是否是您所需要的(请参阅我在评论中的问题)。

顺便说一句:如果您仅按月份分组,那么当您获得重叠数据时可能会遇到问题,例如,数据集包含201101和的数据201201- 两者都将被分组在一起。当您按 yearMonth 进行分组时,这应该不是问题。

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

public class YearMonthSold
{
    public int Year {get; set;}
    public int Month {get; set;}
}

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();

编辑:或如 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();

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

于 2012-05-15T19:07:16.353 回答