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.
¿Esto realmente terminará como una consulta 'SELECT TOP 5 ...' contra la base de datos? –
@Peter Lillevold: Sí. Tomará solo 5 filas en la ejecución de la consulta. – LukLed
@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