2010-02-05 19 views
5

ho qualche codice per la tipizzazione forte Include() 's in LINQ, in questo modo ...estensione query LINQ per

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); 
    } 

La mia domanda è: esiste qualche cosa che posso scrivere un resoconto funzione più generica per qualsiasi livello di successivi include? Piuttosto che doverlo riscrivere per dire 3, 4, ecc., Includi i tipi?

risposta

2

Suppongo che per successivi si intenda sub selettori aggiuntivi.

In tal caso, la seguente funzione utilizza un array di parametri per i sottosettori aggiuntivi (dopo il primo), pur mantenendo che la prima espressione è legata allo stesso tipo T degli altri.

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()); 
}