views:

281

answers:

1

I've got this function

public static AdoEntity.Inspector GetInspectorWithInclude(int id, List<string> properties)
    {
        using (var context = new Inspection09Entities())
        {
            var query = context.Inspector;
            if (properties != null)
            {
                foreach (var prop in properties)
                {
                    if (!string.IsNullOrEmpty(prop))
                        query.Include(prop);
                }
            }
            return query.Where(i => i.ID == id).First();
        }
    }

which i use to get my "Inspectors" from the DB and an additional feature to specify what to "Include" with the data. So it takes a List<'string'> and includes them with the query. This function doesn't seem to work because the returned object still does not include the requested data. Could someone tell me what is wrong with this method/approach.

Thanks in advance.

Solution

Thank you to Misha N. suggestion, I have hatched this EF helper which extends the ObjectQuery class. Hopefully others may find it useful.

/// <summary>
/// The include extesion that takes a list and returns a object query with the included data.
/// </summary>
/// <param name="objectQuery">
/// The object query.
/// </param>
/// <param name="includes">
/// The list of strings to include.
/// </param>
/// <typeparam name="T">
/// </typeparam>
/// <returns>
/// An object query of T type with the included data.
/// </returns>
public static ObjectQuery<T> Include<T>(this ObjectQuery<T> objectQuery, List<string> includes)
{
    ObjectQuery<T> query = objectQuery;
    if (includes != null) includes.ForEach(s => { if (!string.IsNullOrEmpty(s)) query = query.Include(s); });

    return query;
}

Usage example.

using(var context = new MyEntity())
{
    var includes = new List<string>
    {
        "Address",
        "Orders",
        "Invoices"
    }
    return context.CustomerSet.Include(includes).First(c => c.ID == customerID);
}
+1  A: 

Nothing is wrong with your approach, just one little thing need to be changed:

public static AdoEntity.Inspector GetInspectorWithInclude(int id, List<string> properties)
{
    using (var context = new Inspection09Entities())
    {
        var query = context.Inspector;
        if (properties != null)
        {
            foreach (var prop in properties)
            {
                if (!string.IsNullOrEmpty(prop))
                    query = query.Include(prop);// <--- HERE
            }
        }
        return query.Where(i => i.ID == id).First();
    }
}

ObjectQuery.Include() method is returning altered ObjectQuery object, you haven't been doing changes to the inital query.

Hope this helps

Misha N.

related questions