[英]Linq to Entities Group By DateTime
我希望能夠獲得過去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
其中“月”為整數。 沒關系,但出於顯示目的,我沒有年份或類似內容。
誰能提供任何建議?
謝謝。
我建議將密鑰設置為有問題的月份的第一天,這樣,您還可以看到年份信息(因為您需要最近的12個月,所以需要該信息)。
...
group sale by sale.DateSold.Date.AddDays(-(sale.DateSold.Day - 1)) into ds
orderby ds.Key descending
...
您還希望在分組之后而不是之前進行排序,因為分組使用鍵的哈希而不是值,因此您可能無法獲得相同的排序。
為什么不按DateTime分組,因此可以使用«ds.Key»設置«DateSold»。
而且,如果您希望將DateTime的月份存儲在密鑰中,則只需«ds.Key.Month»。
如果您需要的話,我建議您引入一種新的類型來表示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
對象的代碼,但是似乎它不會以任何方式受到此更改的影響。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.