2011-01-18 27 views
7

Supponiamo di avere una tabella denominata Popolazione che memorizza alcuni dati demografici. In T-SQL, per ottenere il numero di persone con più di 50 anni, avrei potuto fare qualcosa di simile:Linq recupera prima tutti i record se eseguo un conteggio?

SELECT COUNT(*) FROM POPULATION 
WHERE AGE > 50 

ho pensato la seguente dichiarazione LINQ avrebbe funzionato, ma restituisce solo zero e non capisco perché.

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

in modo per me per ottenere effettivamente il conteggio, devo fare una delle seguenti operazioni:

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

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

Perché sono gli scenari di cui sopra il caso?

+2

Ci sono dettagli di implementazione che stai tralasciando? context.TableName.Count (x => x.SomeCondition); funziona bene per me – jeffora

+0

La tua prima istruzione LINQ * dovrebbe * funzionare come le ultime due. Sembra un problema con il provider. Quale fornitore LINQ stai usando? – Greg

+0

La risposta selezionata per questa domanda è errata e irrilevante. C'è qualcos'altro, molto probabilmente con il provider di query che stai usando. – jason

risposta

-2

Corretto. come in qualsiasi istruzione SQL, ha un certo ordine da seguire. e se fai un conteggio su dove, in pratica non gli dai nulla su cui contare.

1

In tutti i casi Count() non farà il calcolo in memoria in base ai record restituiti dal database, ma sarà effettivamente cambiare l'SQL generato per includere la dichiarazione COUNT. Una versione semplicistica della query TSQL generato sarebbe qualcosa di simile:

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

Quando si chiama Count() la query viene eseguita immediatamente. Tutte le tue domande sembrano essere corrette, quindi controlla il tuo database, provider e contesto per assicurarti che la query sia eseguita correttamente.

Problemi correlati