2010-02-05 18 views
5

के लिए मैं दृढ़ता से टाइपिंग शामिल के लिए कुछ कोड है() के LINQ में है, इसलिए की तरह ...क्वेरी एक्सटेंशन LINQ

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

मेरा प्रश्न है, वहाँ वैसे भी मैं के लिए एक अधिक सामान्य समारोह खाते में लिख सकते हैं लगातार किसी भी स्तर में शामिल हैं? 3, 4, आदि के लिए इसे फिर से लिखने के बजाय प्रकार शामिल हैं?

उत्तर

2

मुझे लगता है कि लगातार आप अतिरिक्त उप चयनकर्ताओं का मतलब है।

यदि ऐसा है, तो निम्न कार्य अतिरिक्त उप चयनकर्ताओं (पहले के बाद) के लिए पैरामीटर सरणी का उपयोग करता है, जबकि यह सुनिश्चित करते हुए कि पहली अभिव्यक्ति उसी प्रकार टी से जुड़ी है, अन्य के रूप में।

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