2012-05-02 33 views
6

Tôi muốn đặt hàng các giá trị đã chọn theo ngày tăng dần khác biệt.chọn giá trị tolist() khi orderby ngày khác biệt

Ví dụ: tôi có các giá trị này trong cơ sở dữ liệu của mình.

ID | Value | Date 
1 | 35 | 2012/01/20 
2 | 0  | 2012/01/20 
3 | 10 | 2012/02/01 
4 | 0  | 2012/02/01 
5 | 0  | 2012/03/01 
6 | 0  | 2012/03/01 

Kể từ ID 1 có giá trị trên 20 tháng một và ID 3 có giá trị trên 01 tháng 2 tôi muốn hai ngày này để được lựa chọn vào danh sách của tôi về giá trị ngày riêng biệt. Nhưng đối với ID 5 và 6 đều có giá trị 0. Vì vậy, nếu giá trị là 0 tôi cũng muốn giá trị 0 được thêm vào.

Bây giờ linqquery của tôi trông như thế này

 var totalHours = (from u in context.Users 
          join r in context.Reports on u.Id equals r.UserId 
          join w in context.Weeks on r.Id equals w.ReportId 
          join d in context.Days on w.DayId equals d.Id 
          orderby d.Date ascending 
          where r.weekNr.Equals(currentWeek) 
          select d.Hour).ToList(); 

Nhưng truy vấn này tất nhiên mang lại cho tôi 35,0,10,0,0,0 kết quả. Mặc dù tôi muốn cung cấp cho tôi 35,10,0

Tôi không muốn chọn các giá trị khác biệt, nếu ngày 1 tháng 2 và ngày 2 tháng 2 có cùng giá trị. Tôi muốn cả hai giá trị này được thêm vào.

+0

bạn có muốn nhóm và sắp xếp danh sách theo giá trị không? – ARZ

+0

@rickard - vì vậy nếu có một giá trị khác 0 (id 1) và sau đó một giá trị khác là 0 (id 2) bạn muốn chỉ là một số không? Nó có thể xảy ra mà id 1 = 35, id 2 = 50? Nếu vậy, bạn có muốn cả hai? –

+0

@Joanna nếu giá trị bằng nhau cho cùng một ngày (trong trường hợp này 0) tôi cũng muốn giá trị 0 được thêm vào danh sách(). – rickard

Trả lời

5

tôi sẽ đề nghị lần đầu tiên chọn những gì bạn cần từ những truy vấn đầu tiên:

var totalHours = (from u in context.Users 
          join r in context.Reports on u.Id equals r.UserId 
          join w in context.Weeks on r.Id equals w.ReportId 
          join d in context.Days on w.DayId equals d.Id 
          orderby d.Date ascending 
          where r.weekNr.Equals(currentWeek) 
          select new {id = r.UserId, hour = d.Hour, date = d.Date}).ToList(); 

Trong I nêu trên giả định rằng d.Hour tương ứng với trường Value trong ví dụ của bạn.

Sau đó nhóm theo ngày, thứ tự theo giờ giảm dần và chọn mục đầu tiên từ mỗi nhóm:

var distinctValues = totalHours 
       .GroupBy(th => th.Date) 
       .OrderByDescending(v => v.Max(o => o.Hour)) 
       .Select(g => g.First()); 

CẬP NHẬT

Để trở về chỉ là danh sách các số nguyên cho việc sử dụng tài sản Giờ này để thay thế của tuyên bố trên:

var distinctValues = totalHours 
       .GroupBy(th => th.Date) 
       .OrderByDescending(v => v.Max(o => o.Hour)) 
       .Select(g => g.First().Hour) 
       .ToList(); 

UPDATE 2

Bạn có thể thử điều này không?

var distinctValues = totalHours 
       .GroupBy(th => th.Date) 
       .Select(g => g.OrderByDescending(e => e.Hour)) 
       .Select(g => g.First().Hour) 
       .ToList(); 
+0

Tôi có muốn trả lại disticntValues ​​sau khi đã thực hiện các bước này không? Khi tôi cố gắng để tôi nhận được lỗi này "Không thể chuyển đổi hoàn toàn loại 'System.Collections.Generic.IEnumerable ' thành 'System.Collections.Generic.List '. Một chuyển đổi rõ ràng tồn tại (bạn thiếu một dàn diễn viên?) " – rickard

+0

Và nếu tôi đặt .ToList() sau. Chọn (g => g.First()). ToList(); tôi nhận được "Không thể chuyển đổi hoàn toàn loại 'System.Collections.Generic.List ' thành 'System.Collections.Generic.List '" – rickard

+0

@rickard - Có, 'distinctValues' phải là những gì bạn đang tìm kiếm . Nếu bạn muốn chỉ một thuộc tính từ kiểu vô danh thì hãy thay đổi dòng cuối cùng thành '.Select (g => g.First(). Hour)' (hoặc bất kỳ thuộc tính nào khác mà bạn cần). Cuộc gọi ToList() sẽ hoạt động tốt sau đó và cung cấp cho bạn danh sách 'int' - xem cập nhật –

0
var totalHours = (from u in context.Users 
          join r in context.Reports on u.Id equals r.UserId 
          join w in context.Weeks on r.Id equals w.ReportId 
          join d in context.Days on w.DayId equals d.Id 
          orderby d.Date ascending 
          where r.weekNr.Equals(currentWeek) 
          select d.Hour).Distinct().OrderByDescending(n => n).ToList(); 
+0

Tôi không muốn chọn ra các giá trị riêng biệt, chỉ có ngày riêng biệt. Vì vậy, nếu nhiều ngày, nói 1 của tháng hai và 2 của tháng hai có cùng giá trị. Phương pháp này chỉ cho tôi một trong những ngày này. – rickard

2

Bạn có nghĩa là bạn muốn nhóm được nhóm lại theo ngày với tổng số giờ được tổng hợp. Nếu vậy nó sẽ là một cái gì đó như thế này có lẽ?

var totalHours = (from u in context.Users       
join r in context.Reports on u.Id equals r.UserId       
join w in context.Weeks on r.Id equals w.ReportId       
join d in context.Days on w.DayId equals d.Id       
orderby d.Date ascending       
where r.weekNr.Equals(currentWeek)       
).GroupBy(n => n.Date).Select(n => new { Date = n.Key, Hour = Sum(x => x.Hour) }).ToList(); 

Chỉ cần để giải thích

.GroupBy(n => n.Date) 

Will nhóm kết quả theo ngày, do đó bạn sẽ nhận được một hàng riêng biệt mỗi ngày

.Select(n => new { Date = n.Key, Hour = Sum(x => x.Hour) }) 

sẽ lựa chọn và định hình kết quả. Chúng tôi đang định hình thành một vật thể mới. n.Key là chìa khóa mà nhóm làm việc vì vậy đây sẽ là Date. Thuộc tính thứ hai là tổng số giờ nên mỗi ngày riêng biệt sẽ có tổng số giờ. Chúng tôi đang sử dụng từ khóa new để kết quả được đưa vào một đối tượng tùy chỉnh mới. Chúng tôi đã xác định tên của các thuộc tính của đối tượng mới như vậy sẽ có hai - DateHour

+0

Vâng, đó là kết quả giống như tôi sau đó. Nhưng tôi không hiểu tất cả mọi thứ trong mã này và nó mang lại cho tôi lỗi vì vậy tôi không thể kiểm tra nó một cách chính xác. – rickard

+0

xin lỗi tôi đã viết nó ra khỏi đỉnh đầu của tôi - những gì lỗi –

+0

"Một truy vấn cơ thể phải kết thúc với một khoản lựa chọn hoặc một khoản khoản" và "Không thể ngầm chuyển đổi loại 'System.Collections.Generic.List ' 'System.Collections.Generic.List ' "và" Loại biểu thức trong mệnh đề chọn không chính xác. Gõ suy luận không thành công trong lệnh gọi 'Chọn'. " – rickard

Các vấn đề liên quan