2011-01-18 8 views
7

Załóżmy, że mam tabelę o nazwie Populacja, która przechowuje dane demograficzne. W T-SQL, aby uzyskać zliczania osób powyżej 50 lat, mogę zrobić coś takiego:Czy Linq pobiera najpierw wszystkie rekordy, jeśli wykonuję obliczenia?

SELECT COUNT(*) FROM POPULATION 
WHERE AGE > 50 

Myślałem następujące oświadczenie LINQ będzie działać, ale to po prostu zwraca zero, a ja nie rozumiem dlaczego.

var count = _context.Population.Count(x => x.Age > 50); 

W porządku dla mnie, aby rzeczywiście uzyskać zliczania, muszę zrobić jedną z następujących czynności:

var count = _context.Populaton.Where(x => x.Age > 50).Count(); 

var count = _context.Population.Select(x => x.Age > 50).Count(); 

Dlaczego powyższe scenariusze przypadek?

+2

Czy są jakieś szczegóły dotyczące implementacji, których opuszczasz? context.TableName.Count (x => x.SomeCondition); działa dobrze dla mnie. – jeffora

+0

Twoje pierwsze zdanie LINQ * powinno * działać tak samo jak poprzednie dwa. To brzmi jak problem z dostawcą. Z jakiego dostawcy LINQ korzystasz? – Greg

+0

Odpowiedź wybrana na to pytanie jest błędna i nieistotna. Jest jeszcze coś innego, najprawdopodobniej z dostawcą zapytań, którego używasz. – jason

Odpowiedz

-2

Prawidłowo. , podobnie jak w każdym zapytaniu SQL, ma określoną kolejność, którą należy przestrzegać. i jeśli będziesz liczyć, gdzie, w zasadzie nie dajesz mu nic do roboty.

1

We wszystkich przypadkach Count() nie zrobi obliczeń w pamięci w oparciu o zapisy zwrócony z bazy danych, ale będzie to rzeczywiście zmienić wygenerowany SQL zawierać oświadczenie COUNT. Uproszczony wersję swojej wygenerowanego zapytania TSQL byłoby coś jak:

SELECT 
    COUNT(1) 
    FROM [dbo].[Population] AS [Extent1] 
    WHERE [Extent1].[Age] > 50 

Po wywołaniu Count() kwerenda jest wykonywana natychmiast. Wszystkie zapytania wydają się poprawne, więc sprawdź bazę danych, dostawcę i kontekst, aby upewnić się, że zapytanie jest poprawnie wykonywane.

Powiązane problemy