2010-04-16 16 views
40

tengoseleccione top 5 en marco de la entidad

[Person] 
PersonID, EmailAddress, FirstName, LastName 

[OnlineAccount] 
OnlineAccountID, PersonID, Nickname 

se permite a cada persona a tener 0- * OnlineAccount.

En el marco de entidades con C#, ¿cómo selecciono las 5 personas principales que tienen la mayoría de las cuentas?

Respuesta

93

Prueba esto:

var items = context.PersonSet.OrderByDescending(u => u.OnlineAccounts.Count).Take(5); 

Esto devuelve IQueryable<Person>. No devuelve resultados todavía, porque implementa la ejecución diferida. Será traducido a SQL y ejecutadas cuando se necesiten:

var metarializedItems = items.ToList(); // ToList forces execution 

o

foreach(var item in items) // foreach forces execution 

Ejemplo anterior se traducirá a SQL similar a ésta:

SELECT TOP 5 p.PersonID, p.EmailAddress, p.FirstName, p.LastName 
FROM Person p 
ORDER BY (SELECT COUNT(*) FROM OnlineAccount oa WHERE p.PersonID = oa.PersonID) DESC 

no será este SQL exacto. Las diferentes versiones de EF pueden producir diferentes SQL, pero lo escribí para ilustrar cómo funciona. Take(5) se traduce a TOP 5. OrderByDescending(u => u.OnlineAccounts.Count) se traduce al ORDER BY (SELECT COUNT(*) FROM OnlineAccount oa WHERE p.PersonID = oa.PersonID) DESC. Este es el poder del Entity Framework. Traduce expresiones .NET a SQL.

+0

¿Esto realmente terminará como una consulta 'SELECT TOP 5 ...' contra la base de datos? –

+0

@Peter Lillevold: Sí. Tomará solo 5 filas en la ejecución de la consulta. – LukLed

+0

@LukLed ¿Estás seguro de eso? ¿Quiere decir que el EF no cumple con su ejecución antes de procesar el método de extensión IEnumerable? No estoy seguro de que sea cierto ... – Matthew

Cuestiones relacionadas