Un IQueryable (antes de que se enumere) no es el resultado en sí mismo sino la lógica utilizada para devolver esos resultados.
Para utilizar un ejemplo de LINQ2SQL ... imagine que devuelve un IQueryable of Clients. Bajo el capó que no va a ser una lista de clientes (hasta que ToList()) pero se podía comprender ser una consulta SQL, así:
SELECT * FROM [Clients]
Ahora bien, esto es muy útil porque no hemos golpeado la base de datos todavía! Lo que permite decir cuando ese IQueriable regresa queremos refinarlo a clientes llamados "Bob" que podemos hacer:
var clients = GetClients().Where(c => c.Name == "Bob");
Ahora el IQueriable se parece a esto bajo el capó:
SELECT * FROM [Clients] WHERE Name = 'Bob'.
Ahora, cuando Hago clients.ToList(), esa consulta se ejecutará, se golpeará la base de datos, y tengo una lista de clientes llamada bob sin tener que haber seleccionado todos los clientes y luego rastrearlos en la memoria, o realizar 2 hits de bases de datos separados.
Para obtener un ejemplo de esto mordiéndolo en la parte posterior, intente acceder a elementos secundarios cuando su contexto de datos se haya salido del alcance (por ejemplo, ejecute su selección dentro de una instrucción using). Aquí es donde las opciones de carga son útiles, en LINQ2SQL.
Espero que ayude
gran pregunta. me salvaste horas de investigación. – KyleM