Tôi đã thực hiện một chút nghiên cứu về điều này và tốt nhất tôi đã tìm thấy cho đến nay là sử dụng Asenumerable trên toàn bộ tập dữ liệu, để lọc xảy ra trong LINQ đối tượng thay vì hơn cả DB. Tôi đang sử dụng EF mới nhất.Entity Framework: Phân nhóm hiệu quả theo tháng
tôi làm việc (nhưng rất chậm) mã là:
var trendData =
from d in ExpenseItemsViewableDirect.AsEnumerable()
group d by new {Period = d.Er_Approved_Date.Year.ToString() + "-" + d.Er_Approved_Date.Month.ToString("00") } into g
select new
{
Period = g.Key.Period,
Total = g.Sum(x => x.Item_Amount),
AveragePerTrans = Math.Round(g.Average(x => x.Item_Amount),2)
};
này mang lại cho tôi tháng ở định dạng YYYY-MM, cùng với tổng số tiền và số tiền trung bình. Tuy nhiên phải mất vài phút mỗi lần.
Cách giải quyết khác của tôi là thực hiện truy vấn cập nhật trong SQL vì vậy tôi có trường YYYYMM để nhóm theo nguyên bản. Thay đổi DB không phải là một sửa chữa dễ dàng tuy nhiên vì vậy bất kỳ đề xuất sẽ được đánh giá cao.
Chủ đề tôi tìm thấy ý tưởng mã trên (http://stackoverflow.com/questions/1059737/group-by-weeks-in-linq-to-entities) đề cập đến 'chờ cho đến khi .NET 4.0'. Có điều gì gần đây được giới thiệu giúp trong tình huống này không?
Tuyệt vời, cảm ơn nhiều Adrian. Tôi vừa làm một bài kiểm tra nhanh và bạn mất khoảng 3,5 giây so với bản 5.2 cho bản gốc. Sự chậm trễ lâu dài phải là một số bước khác trong chương trình của tôi. Tôi đánh giá cao nỗ lực của bạn, mã của bạn đã được đưa vào hoạt động! – Glinkot
Đây không phải là câu trả lời được chấp nhận. Đây chỉ là một cách giải quyết! Câu trả lời từ @cryss cho kết quả hoàn hảo. –
Giải pháp tuyệt vời, "nhóm theo mới" thực sự mạnh mẽ và đơn giản hóa các truy vấn phức tạp. – Jacob