我有一個特定時間段(activationDate到endDate)的服務銷售清單。我需要按月份(例如2012年4月)生成銷售報告分組。對於每個月我想展示多少整月的使用和多少天。使用日期/月份分組處理列表中的數據
我的類:
public class SaleMonth
{
public DateTime MonthYear { get; set; }//.ToString("Y")
public int FullMonth { get; set; }
public int DaysMonth { get; set; }
public string TotalMonths { get { return String.Format("{0:N2}",
(((FullMonth * 30.5) + DaysMonth)/30.5)); } }
}
我曾嘗試:
using (CompanyContext db = new CompanyContext())
{
var saleList = db.MySales.ToList();
DateTime from = saleList.Min(s => s.ActivationDate),
to = saleList.Max(s => s.EndDate);
for (DateTime currDate = from.AddDays(-from.Day + 1)
.AddTicks(-from.TimeOfDay.Ticks);
currDate < to;
currDate = currDate.AddMonths(1))
{
var sm = new SaleMonth
{
MonthYear = currDate,
FullMonth = 0,
DaysMonth = 0
};
var monthSell = saleList.Where(p => p.ActivationDate < currDate.AddMonths(1)
|| p.EndDate > currDate);
foreach (var sale in monthSell)
{
if (sale.ActivationDate.Month == sale.EndDate.Month
&& sale.ActivationDate.Year == sale.EndDate.Year)
{//eg 4/6/13 - 17/6/13
sm.DaysMonth += (sale.EndDate.Day - sale.ActivationDate.Day + 1);
}
else
{
if (sale.ActivationDate.Year == currDate.Year
&& sale.ActivationDate.Month == currDate.Month)
sm.DaysMonth += (currDate.AddMonths(1) - sale.ActivationDate).Days;
else if (sale.EndDate.Year == currDate.Year
&& sale.EndDate.Month == currDate.Month)
sm.DaysMonth += sale.EndDate.Day;
else if(sale.ActivationDate.Date <= currDate
&& sale.EndDate > currDate.AddMonths(1))
sm.FullMonth++;
}
}
vm.SaleMonthList.Add(sm);
}
}
我有我失去了一些東西的感覺,必須有一個更優雅的方式來做到這一點。
Here is a picture顯示一些銷售和從他們產生的報告。
真的謝謝你!我喜歡填充日期的方式,然後通過它們並相應地獲取數據。 除了根據給定的日期檢索所有銷售對我其他地方非常有用 - 單擊報告中每行的「詳細信息」。 所以+1兩次=) – oCcSking
嗨Ijust在Sum函數上得到這個錯誤..「只有無參數的構造函數和初始化程序在linq中支持實體」我嘗試將addMonth(1)更改爲外部var - monthLetter,但是stil get這個例外「你有空閒嗎? – oCcSking
@oCcSking,對於Linq-to-Entities,您必須刪除所有正在創建的無參數構造函數。如果你看看我的編輯,我已經改變了應該讓你再次去的所有查詢,並且至少會讓你運行來進行調整。 –