大量の画像データをトラバースするコードを書いて、送信用に圧縮されたすべてを含む大きなデルタブロックを準備しています。
このデータの例を以下に示します
[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);
}
}
これで作業するときは、すべてをファイルストリームに処理します。いつでもメモリにできるだけ少なくしたいです。
このようにするだけで十分ですか?
foreach(var b in context.Where(o => somefilters).AsNoTracking())
MessagePackSerializer.Serialize(stream, b);
これでもメモリがすべてのblobレコードで満たされますか、それとも、列挙子で反復するときに1つずつ処理されますか?ToListを使用せず、列挙子のみを使用しているため、Entity Frameworkは外出先でそれを処理できるはずですが、それが何をするのかはわかりません。
これが適切に処理される方法に関するガイダンスを提供できるEntity Frameworkのエキスパート。
stream
から来たのですか?)。最後に、SQL Serverファイルストリームデータを高速に処理し、ストリーミングするには、EFを超える別のアプローチが必要です。