Category Archives: ORM
Separate Binary Data Out Of An Entity For Effective Loading
I received an email this morning asking about loading binary data related to an entity, here is the excerpt:
“Hello,
I was reading the following post on your blog and checking the code in Google Code. Entity Framework 4 POCO, Repository and Specification Pattern [Upgraded to EF 4.1]
I found it really interesting and realized that the performance issues where solved.
But how do you handle binary data?
Consider you have an entity with 2 Byte[] fields (varbinary or filestream in the database).
public class Product
{
public Int32 Id { get; set; }
public Boolean Available { get; set; }
public String Name { get; set; }
public Byte[] Image { get; set; }
public Byte[] Brochure { get; set; }
}
When N records are loaded you will get N * 2 files being loaded even if you want to display only the names.
One solution to this problem is to apply a projection. For example:
context.Products.Where(x => x.Available).Select(x => new ProductView { Available = x.Available, Name = x.Name, Image = x.Image });
In this case I am leaving out the brochure but including the image … How do you address this with your code?”
—————————–
Here is my answer:
public class BinaryData
{
public Int32 Id { get; set; }
public Byte[] Data { get; set; }
}
public class Product
{
// ... other properties
public BinaryData Image { get; set; }
public BinaryData Brochure { get; set; }
}
With lazy-loading enabled, you won’t worry about loading binary data (Image, Brochure) when loading Product, but it will be loaded when you access to it like: product.Image”
I myself think it is a good design practice when working with ORM framework, like Entity Framework or NHibernate.
What do you think? If there is a better solution for this, please drop a comment.