I saw the following code on a customer object which made me think about affording a better way to query domain relationships without the extra methods, extension methods come to the rescue!
I realise transparent lazy loading a la Nhibernate is another option, but i think that this way keeps the spirit of explicitly loading from the database, but reduces the amount of code clutter on the client side so you are not forever checking whether a relationship is loaded or not, you simply request an IQueryable from the EntityCollection<T>.
/// <summary> /// Finds a customer account with the specified ID /// </summary> /// <param name="customerAccountID">ID of the customer account to find</param> /// <returns>Customer account with the specified ID</returns> public CustomerAccount FindAccount(int customerAccountID) { if(!this.CustomerAccounts.IsLoaded) { this.CustomerAccounts.Load(); }
var query = from ca in this.CustomerAccounts where ca.CustomerAccountID == customerAccountID select ca;
return query.FirstOrDefault(); }
I added a static class with the extension methods for the EntityCollection type as follows:
public static class EntityCollectionExtensions { public static EntityCollection<T> EnsureLoaded<T>(this EntityCollection<T> entityCollection) where T : class, IEntityWithRelationships { if (!entityCollection.IsLoaded) entityCollection.Load(); return entityCollection; }
public static IQueryable<T> AsQueryable<T>(this EntityCollection<T> entityCollection, bool ensureLoaded) where T : class, IEntityWithRelationships { if (ensureLoaded) entityCollection = EnsureLoaded<T>(entityCollection); return entityCollection.AsQueryable(); } }
This allows you to do the following, which will only go to the database if the relationship is not loaded.
var query = from ca in this.CustomerAccounts.AsQueryable(true) // ensure the relationship is loaded and return a queryable on it where ca.CustomerAccountID == customerAccountID select ca; return query.FirstOrDefault();
Powered by: newtelligence dasBlog 1.9.6264.0
Disclaimer The opinions expressed herein are my own personal opinions and do not represent my employer's view in anyway.
© Copyright 2008, Keith Patton
E-mail