2009-03-03 12 views
5

Một số truy vấn LINQ vẫn đang giải đố tôi.Chuyển đổi SQL chứa hàng đầu, số lượng, nhóm và thứ tự thành LINQ (2 thực thể)

cho một bảng 'Số lần truy cập' có chứa hai cột, 'Trang' và 'Ngày', tôi muốn tìm hầu hết các Trang có nhiều hàng nhất trong một khoảng thời gian xác định.

Trong SQL Tôi sẽ sử dụng này:

SELECT TOP 10 
     [Page] 
     ,COUNT([Page]) as Number 
FROM dbo.[Hits] 
WHERE [Date] >= CONVERT(datetime,'14 Jan 2009') 
AND [Date] < CONVERT(datetime,'15 Jan 2009') 
Group BY [Page] 
Order by Number DESC 

Trong LINQ tôi đã không có ý tưởng làm thế nào để tiếp cận này, bất cứ ai có thể giúp tôi ở đây? Tôi đã cố gắng chuyển đổi nó bằng cách sử dụng linqer, nhưng nó chỉ cho thấy một lỗi cho biểu thức này.

Trả lời

7

Something như thế này nên làm việc:

(from p in DataContext.Hits 
where (p.Date >= minDate) && (p.Date < maxDate) 
group p by p.Page into g 
select new { Page = g.Key, Number = g.Count() }).OrderByDescending(x => x.Number).Take(10); 
+0

Typo trong p < maxDate -> p.Date Sam

+0

Oh, và, tất nhiên, nếu mã LINQ bạn được sử dụng trong C# người ta sẽ phải sử dụng '&&' thay vì 'và'. Dunno làm thế nào nó sẽ cần phải được trong VB. – Sam

7
var top10hits = objectContext.Hits 
    .Where(h => minDate <= h.Date && h.Date < maxDate) 
    .GroupBy(h => h.Page) 
    .Select(g => new { Page = g.Key, Number = g.Count() }) 
    .OrderByDescending(x => x.Number) 
    .Take(10); 
+0

Lỗi đánh máy. Chọn (g => Trang = g.Key, Number = g.Count()}) -> .Chọn (g => new {Page = g.Key, Number = g.Count()}) Nếu không "giống nhau .. nhưng khác" :) – veggerby

+0

Cảm ơn thông báo lỗi chính tả - veggerby; và chỉnh sửa - Tư pháp. –

+0

Ngoài ra - @ "giống nhau ... nhưng khác" Tôi tìm thấy các phương pháp mở rộng dễ phát hiện hơn cú pháp hiểu truy vấn. Vì vậy, đó là những gì tôi sử dụng. –

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