2011-05-08 6 views
15

Quiero definir una consulta de base de datos utilizando LINQ y mi contexto EntityFramework pero no quiero que se devuelvan las entidades; ¡Quiero un lector de datos!¿Cómo puedo devolver un lector de datos cuando uso Entity Framework 4?

¿Cómo puedo hacer esto? Esto es para exportar filas a un archivo CSV.

Cheers, Ian.

+0

Por qué no acaba de obtener los objetos y serializar los a CSV? – R0MANARMY

+0

No sé cuántos objetos habrá, por lo que un lector de datos detiene el llenado de la memoria del servidor. –

+0

Al mirar un poco, es posible que no pueda acceder fácilmente, hay un [ExecuteDbDataReader] (http://msdn.microsoft.com/en-us/library/system.data.common.dbcommand.executedbdatareader (v = VS.90) .aspx), pero está protegido, por lo que probablemente no deba tratar de conseguirlo. Si esto no se hace con mucha frecuencia y/o si la consulta no es demasiado costosa, puede intentar buscar los resultados de la consulta para asegurarse de no tener demasiados objetos en la memoria a la vez. – R0MANARMY

Respuesta

5

Esta pregunta es sobre EF 4, pero para cualquier otra persona con EF 6 o superior, puede utilizar el método de extensión AsStreaming().

http://msdn.microsoft.com/en-us/library/dn237204(v=vs.113).aspx

+1

Tenemos un ganador. –

+0

Para cualquiera que sea como yo y no tenga idea de qué es AsStreaming(), esta es la única referencia de aprobación que pude encontrar: http://entityframework.codeplex.com/wikipage?title=Design%20Meeting%20Notes % 20-% 20december% 206% 2C% 202012. No parece haber otra documentación en ninguna parte. – Mike

+3

Este método ahora está obsoleto y llamarlo no tiene ningún efecto porque las consultas LINQ se transmiten de manera predeterminada. Supongo que eso es solo para EF6, sin embargo. Aún deberías usar la respuesta de Ladislav para EF4. – NightOwl888

16

Si necesita esto, es más probable que esté haciendo algo inesperado. La iteración simple a través del resultado materializado de la consulta debe ser lo que necesita, es la forma ORM. Si no te gusta, usa SqlCommand directamente.

DbContext API se ha simplificado y, debido a eso, no contiene muchas funciones disponibles en ObjectContext API. Acceder al lector de datos es uno de ellos. Usted puede tratar de convertir a DbContextObjectContext y utilizar la API más complejo:

ObjectContext objContext = ((IObjectContextAdapter)dbContext).ObjectContext; 
using (var connection = objContext.Connection as EntityConnection) 
{ 
    // Create Entity SQL command querying conceptual model hidden behind your code-first mapping 
    EntityCommand command = connection.CreateCommand(); 
    command.CommandText = "SELECT VALUE entity FROM ContextName.DbSetName AS entity"; 
    connection.Open(); 
    using (EntityDataReader reader = command.ExecuteReader(CommandBehavior.SequentialAccess)) 
    { 
     ... 
    } 
} 

Pero pura forma ADO.NET es mucho más fácil y más rápido debido a que el ejemplo anterior sigue utilizando la cartografía de consulta a consulta SQL:

using (var connection = new SqlConnection(Database.Connection.ConnectionString)) 
{ 
    SqlCommand command = connection.CreateCommand(); 
    command.CommandText = "SELECT * FROM DbSetName"; 
    connection.Open(); 
    using(SqlDataReader reader = command.ExecuteReader()) 
    { 

    } 
} 
+3

"Si necesita esto, probablemente esté haciendo algo inesperado". No creo que haya nada particularmente extraño en solicitar una gran cantidad de objetos para exportar o generar correos electrónicos. El ORM aún podría materializar objetos pero transmitirlos desde la base de datos en un tipo de lector de datos puro. LLBLGen le permite a uno tener acceso a un lector de datos. http://www.llblgen.com/documentation/2.6/Using%20the%20generated%20code/SelfServicing/gencode_datareadersprojections.htm –

Cuestiones relacionadas