Estoy escribiendo un código que atraviesa grandes cantidades de datos de imágenes, preparando un gran bloque delta que lo contiene todo comprimido para enviar.
Aquí hay una muestra de cómo podrían ser estos datos
[MessagePackObject]
public class Blob : VersionEntity
{
[Key(2)]
public Guid Id { get; set; }
[Key(3)]
public DateTime CreatedAt { get; set; }
[Key(4)]
public string Mediatype { get; set; }
[Key(5)]
public string Filename { get; set; }
[Key(6)]
public string Comment { get; set; }
[Key(7)]
public byte[] Data { get; set; }
[Key(8)]
public bool IsTemporarySmall { get; set; }
}
public class BlobDbContext : DbContext
{
public DbSet<Blob> Blob { get; set; }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Blob>().HasKey(o => o.Id);
}
}
Cuando trabajo con esto, proceso todo en un flujo de archivos, y quiero mantener la menor cantidad posible en la memoria en cualquier momento.
¿Es suficiente hacerlo así?
foreach(var b in context.Where(o => somefilters).AsNoTracking())
MessagePackSerializer.Serialize(stream, b);
¿Esto todavía llenará la memoria con todos los registros de blob, o serán procesados uno por uno a medida que itere en el enumerador? No está utilizando ninguna lista de ToList, solo el enumerador, por lo que Entity Framework debería poder procesarlo sobre la marcha, pero no estoy seguro de si eso es lo que hace.
Cualquier experto en Entity Framework aquí que pueda dar alguna orientación sobre cómo se maneja esto correctamente.
stream
viene?). Finalmente, el manejo rápido de datos y transmisión de archivos de SQL Server requiere un enfoque diferente que va más allá de EF.