2009-04-18 59 views
31

Tôi có bảng có trường ngày giờ. Tôi muốn lấy tập hợp kết quả được nhóm theo kết hợp tháng/năm và số lượng bản ghi xuất hiện trong tháng/năm đó. Làm thế nào điều này có thể được thực hiện trong LINQ?LINQ: Nhóm theo tháng và năm trong trường ngày giờ

Gần nhất tôi đã có thể hình dung ra là trong TSQL:

select substring(mo,charindex(mo,'/'),50) from (
select mo=convert(varchar(2),month(created)) + '/' + convert(varchar(4), year(created)) 
,qty=count(convert(varchar(2),month(created)) + '/' + convert(varchar(4), year(created))) 
from posts 
group by convert(varchar(2),month(created)) + '/' + convert(varchar(4), year(created)) 
) a 
order by substring(mo,charindex(mo,'/')+1,50) 

Nhưng tôi sẽ không nói rằng hoạt động ...

Trả lời

59
var grouped = from p in posts 
    group p by new { month = p.Create.Month,year= p.Create.Year } into d 
    select new { dt = string.Format("{0}/{1}",d.Key.month,d.Key.year), count = d.Count() }; 

Dưới đây là danh sách các chức năng có sẵn trong DateTime LINQ. Để làm việc này bạn cũng sẽ cần phải hiểu multi-column grouping

ra lệnh giảm dần

var grouped = (from p in posts 
    group p by new { month = p.Create.Month,year= p.Create.Year } into d 
    select new { dt = string.Format("{0}/{1}",d.Key.month,d.Key.year), count = d.Count()}).OrderByDescending (g => g.dt); 
+0

tôi muốn sắp xếp điều này theo tháng như tháng hiện tại đầu tiên ở đầu và tháng trước tiếp theo một thứ như vậy ?? xin vui lòng giúp –

+0

bạn có thể làm điều đó bằng cách thêm một orderbydescending – Jeremy

2

This Site có một ví dụ rằng nên điền nhu cầu của bạn.

Đây là cú pháp cơ bản:

from o in yg 
group o by o.OrderDate.Month into mg 
select new { Month = mg.Key, Orders = mg } 
+6

Với danh sách chứa đơn đặt hàng từ nhiều năm, điều này sẽ nhóm các đơn đặt hàng từ tháng 1 năm 2010, 2011 và 2012 vào cùng một nhóm. – Moulde

1

bạn cũng có thể làm theo cách này

from o in yg 
group o by o.OrderDate.ToString("MMM yyyy") into mg 
select new { Month = mg.Key, Orders = mg } 

kết quả của bạn sẽ

{tháng 1 năm 2014 , 25} {Feb 2015, 15} v.v ...

7

Điều này là dành cho những người đang cố gắng để thực hiện tương tự nhưng bằng cách sử dụng biểu thức lambda.

Giả sử rằng bạn đã có một bộ sưu tập các thực thể và mỗi thực thể có OrderDate là một trong các thuộc tính của nó.

yourCollection 
// This will return the list with the most recent date first. 
.OrderByDescending(x => x.OrderDate) 
.GroupBy(x => new {x.OrderDate.Year, x.OrderDate.Month}) 
// Bonus: You can use this on a drop down 
.Select(x => new SelectListItem 
     { 
      Value = string.Format("{0}|{1}", x.Key.Year, x.Key.Month), 
      Text = string.Format("{0}/{1} (Count: {2})", x.Key.Year, x.Key.Month, x.Count()) 
     }) 
.ToList(); 

Nếu bạn không cần phải thu SelectListItem sau đó chỉ cần thay thế các lựa chọn với một này:

.Select(x => string.Format("{0}/{1} (Count: {2})", x.Key.Year, x.Key.Month, x.Count())) 
0

Đây là một giải pháp đơn giản cho nhóm trong DateTime.

List<leaveallview> lav = new List<leaveallview>(); 
lav = dbEntity.leaveallviews.Where(m =>m.created==alldate).ToList(); 
dynamic lav1 = lav.GroupBy(m=>m.created.Value.GetDateTimeFormats()).FirstOrDefault().ToList(); 
Các vấn đề liên quan