Wednesday 31 March 2010

ObjectQuery Include Extension

I was tired of using string to include a relation with Linq to Entities like
contexte.Users.Include("Roles")
So I decided to write an extension that would enable to use an expression like
contexte.Users.Include(u => u.Roles)
so here is the code:
    public static class ObjectQueryExtensions
{
public static ObjectQuery<TEntity> Include<TEntity, TProperty>(this ObjectQuery<TEntity> query, Expression<Func<TEntity, TProperty>> expression) where TEntity : class
{
string name = expression.GetPropertyName();
return query.Include(name);
}
}
and you also need this:
    public static class ExpressionExtensions
{
public static string GetPropertyName<TObject, TProperty>(this Expression<Func<TObject, TProperty>> expression) where TObject : class
{
if (expression.Body.NodeType == ExpressionType.Call)
{
MethodCallExpression methodCallExpression = (MethodCallExpression)expression.Body;
string name = ExpressionExtensions.GetPropertyName(methodCallExpression);
return name.Substring(expression.Parameters[0].Name.Length + 1);
}
return expression.Body.ToString().Substring(expression.Parameters[0].Name.Length + 1);
}

private static string GetPropertyName(MethodCallExpression expression)
{
MethodCallExpression methodCallExpression = expression.Object as MethodCallExpression;
if (methodCallExpression != null)
{
return GetPropertyName(methodCallExpression);
}
return expression.Object.ToString();
}
}