2009-03-03 12 views
5

Niektóre zapytania LINQ nadal mnie łamią.Konwersja SQL zawierającego górę, licznik, grupę i zamówienie do LINQ (2 encje)

dla tabeli "Uderzenia" zawierającej dwie kolumny, "Strona" i "Data", chcę znaleźć najbardziej Pages z największą liczbą wierszy w określonym przedziale czasu.

W SQL Chciałbym użyć tego:

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 

w LINQ mam pojęcia, w jaki sposób podejść do tego, może ktoś mi pomóc tutaj? Próbowałem przekonwertować go za pomocą linqer, ale po prostu pokazuje błąd dla tego wyrażenia.

Odpowiedz

7

Coś jak to powinno działać:

(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 w p < maxDate -> p.Date < – Sam

+0

MaxDate :) Aha, i, oczywiście, jeśli kod LINQ jest stosowany w C# jeden musiałby użyj "&&" zamiast "i". Nie wiem jak to musi być w 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

Typo w. Wybierz (g => Strona = g.Key, Numer = g.Count()}) -> . Wybierz (g => nowy {Strona = g.Key, Numer = g.Count()}) W przeciwnym razie "to samo samo .. ale różne" :) – veggerby

+0

Dzięki za uwagę literówki - veggerby; i edycja - Sprawiedliwość. –

+0

Również - @ "to samo ... ale różne" Uważam, że metody rozszerzenia są łatwiejsze do znalezienia niż składnia ze zrozumieniem zapytań. Więc tego używam. –