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 は int であるためです。

私は以下を使用してみました:

Month = ds.Key

「月」はintです。これは問題ありませんでしたが、表示目的のために、年などはありません。

誰でもアドバイスを提供できますか?

ありがとう。

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

DateTimeでグループ化して、«ds.Key»で«DateSold»を設定できるようにしてみませんか。
また、キーにDateTimeストアの月が必要な場合は、«ds.Key.Month»を実行できます。

于 2012-05-15T14:59:56.303 に答える
1

それが必要な場合は、表現する新しいタイプを導入することをYearMonthお勧めします(コメントの私の質問を参照してください)。

ところで: 月のみでグループ化する場合、重複するデータを取得する場合に問題が発生する可能性があります。たとえば、データセットに201101andのデータが含まれている場合、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 に答える