You can build up your query dynamically and then hit the database once...instead of once for each criterion.
I often see a lot of people using strings to denote which child entities to eager load.
I feel it's much better to use the Strongly Typed syntax.
So if you have:
var query = _orderRepository.Context.CreateObjectSet
("CBD_SITES") .Include("ORDER_DETAIL") .Include("ORDER_DETAIL.PRODUCT") .Include("ADDRESS").AsQueryable();
you can convert it to:
var query = _orderRepository.GetQuery() .Include(h => h.ORDER_DETAIL.Select(t => t.PRODUCT)) .Include(h => h.ADDRESS);
I got the syntax for the Include statement from this post on Stack Overflow
To understand how to load related entities, in Entity Framework, read this article:
Using DbContext in EF 4.1 Part 6: Loading Related Entities
This post also makes for interesting reading about a related problem.
FYI: If you're wondering what the '_orderRepository' object above is all about, it is an Instance of our custom Repository<TEntity> class, which implements our custom IRepository<TEntity> interface (which in turn implements IDisposable)
...the Repository acts as a wrapper to System.Data.Objects.ObjectContext from the Entity Framework.
We do this so we can use StructureMap in inject a Repository<TEntity> into our Controllers at runtime where TEnity is the Model for that Controller.
So, all '_orderRepository.GetQuery()' does is wraps up and returns the property
System.Data.Objects.ObjectContext.ObjectSet as Queryable