2010-02-05 31 views
5

Tôi có một số mã cho mạnh mẽ gõ Bao gồm() 's trong LINQ, như vậy ...Query Extension for 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); 
    } 

Câu hỏi của tôi là, là có anyway tôi có thể viết một tài khoản hàm tổng quát hơn cho bất kỳ cấp độ liên tiếp bao gồm? Thay vì phải viết lại nó để nói 3, 4, vv bao gồm các loại?

Trả lời

2

Tôi đoán bằng cách tiếp tục bao gồm bạn có nghĩa là các bộ chọn phụ bổ sung.

Nếu có, thì hàm sau sử dụng mảng tham số cho các bộ chọn phụ bổ sung (sau dấu chọn đầu tiên) trong khi duy trì biểu thức đầu tiên được gắn với cùng kiểu T như các kiểu khác.

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()); 
} 
Các vấn đề liên quan