2010-02-05 11 views
5

Tengo algo de código para la tipificación fuerte Incluye() 's en LINQ, al igual que ...Extensión de consultas LINQ para

public static ObjectQuery<T> Include<T>(this ObjectQuery<T> mainQuery, Expression<Func<T, object>> subSelector) 
    { 
     return mainQuery.Include(((subSelector.Body as MemberExpression).Member as System.Reflection.PropertyInfo).Name); 
    } 

    /// <summary> 
    /// Old way: (from dbUser in DataSource.DataContext.Users.Include("UserSubscriptions.ChurchSubscriptions") select dbUser); 
    /// New way: (from dbUser in DataSource.DataContext.Users.Include<Users, UserSubscriptions>(u => u.UserSubscriptions, s => s.ChurchSubscriptions) select dbUser); 
    /// </summary> 
    public static ObjectQuery<T> Include<T, Q>(this ObjectQuery<T> mainQuery, Expression<Func<T, object>> tSubSelector, Expression<Func<Q, object>> qSubSelector) 
    { 
     string tProperty = ((tSubSelector.Body as MemberExpression).Member as System.Reflection.PropertyInfo).Name; 
     string qProperty = ((qSubSelector.Body as MemberExpression).Member as System.Reflection.PropertyInfo).Name; 
     string path = string.Format("{0}.{1}", tProperty, qProperty); 
     return mainQuery.Include(path); 
    } 

Mi pregunta es, ¿hay alguna forma de escribir una cuenta de funcionalidad más genérico para cualquier nivel de sucesiva incluye? ¿En lugar de tener que reescribirlo para decir 3, 4, etc. incluir tipos?

Respuesta

2

Supongo que por sucesivas incluye significa subsectores secundarios adicionales.

En caso afirmativo, la siguiente función utiliza una matriz de parámetros para los sub selectores (después de la primera) y mantiene que la primera expresión está vinculada al mismo tipo T que los demás.

public static ObjectQuery<T> Include<T>(this ObjectQuery<T> mainQuery, Expression<Func<T, object>> tSubSelector, params Expression<Func<object, object>>[] subSelectors) 
{ 
    var pathBuilder = new StringBuilder(((PropertyInfo)((MemberExpression)tSubSelector.Body).Member).Name); 
    foreach (var selector in subSelectors) 
    { 
     pathBuilder.Append('.'); 
     pathBuilder.Append(((PropertyInfo)((MemberExpression)selector.Body).Member).Name); 
    } 

    return mainQuery.Include(pathBuilder.ToString()); 
} 
Cuestiones relacionadas