Tôi đang sử dụng LINQ to EF và có các truy vấn LINQ sau:Sử dụng LINQ làm thế nào để tôi có một nhóm bởi một "lĩnh vực tính toán"
var results = (from x in ctx.Items
group x by x.Year into decades
orderby decades.Count() descending
select new { Decade = decades.Key, DecadeCount = decades.Count() });
Vì vậy, hình thức này được tôi đến nơi tôi muốn trở thành, trong đó tôi nhận được các mặt hàng được chia nhỏ theo năm và số lượng mặt hàng trong năm đó. (tức là 2001 - 10, 1975 - 15, 2005 - 5, 1976 - 1) Điều tôi thực sự muốn làm là phá vỡ chúng theo thập kỷ (tức là năm 2000 - 15, 1970 - 16).
Làm cách nào có một "trường được tính toán" trong phần "bởi" của mệnh đề nhóm cho câu lệnh Linq. Tôi nghĩ rằng những gì tôi muốn về cơ bản giống như:
var results = (from x in ctx.Items
group x by (x => x.Year.Value.ToString().Substring(0, 3) + "0s") into decades
orderby decades.Count() descending
select new { Decade = decades.Key, DecadeCount = decades.Count() });
Hoặc thường là cú pháp để tôi có thể thực hiện một số đánh giá/tính toán phức tạp hơn để thực hiện từng nhóm. Bất kỳ ý tưởng?
EDIT (cập nhật):
(. X => x.Year.Value.ToString() substring (0, 3) + "0s") - không hoạt động - "LINQ to Entities không nhận ra phương thức 'System.String ToString()' và phương thức này không thể được dịch sang biểu thức cửa hàng. "
(x.Year/10 * 10) - Về mặt chức năng công trình (cảm ơn bạn) - các "vấn đề" duy nhất là 's' không phải là ở cuối dòng (tức là năm 1970 so với năm 1970)
Có anyway để đặt một hàm trong mệnh đề by? tức là nhóm x bởi this.ManipulateYear (x.Year) thành nhiều thập kỷ ... hoặc ... x => x.Year.Value.ToString(). Chuỗi con (0,3) + "0s" ?? Sẽ tốt hơn nếu có một số kỹ thuật (chẳng hạn như gọi một hàm hoặc sử dụng một biểu thức lambda) để tôi có thể bao gồm bất kỳ trường hợp nào mà tôi có thể nghĩ đến.
Cảm ơn một lần nữa vì sự giúp đỡ của mọi người về vấn đề này.
Không, một nhóm đã là một IEnumerable của IEnumerables (như IGrouping kéo dài IEnumberable). Không cần SelectMany ở đây. –