object ThenInclude(TypeDescriptor typeDescriptor, object lastQuery, TypeDescriptor declaringTypeDescriptor, Func <object, object> queryBuilder) { int navCount = typeDescriptor.NavigationPropertyDescriptors.Count; for (int i = 0; i < typeDescriptor.NavigationPropertyDescriptors.Count; i++) { //entity.TOther PropertyDescriptor propertyDescriptor = typeDescriptor.NavigationPropertyDescriptors[i]; TypeDescriptor navTypeDescriptor = propertyDescriptor.GetPropertyTypeDescriptor(); if (declaringTypeDescriptor != null && navTypeDescriptor == declaringTypeDescriptor) { continue; } Func <object, object> includableQueryBuilder = query => { return(this.CallThenIncludeMethod(queryBuilder(query), propertyDescriptor)); }; lastQuery = this.ThenInclude(navTypeDescriptor, this.CallThenIncludeMethod(lastQuery, propertyDescriptor), typeDescriptor, includableQueryBuilder); if (i < navCount - 1) { lastQuery = queryBuilder(lastQuery); } } return(lastQuery); }
object Include(TypeDescriptor typeDescriptor, object lastQuery, PropertyDescriptor propertyDescriptor) { //entity.TOther or entity.List TypeDescriptor navTypeDescriptor = propertyDescriptor.GetPropertyTypeDescriptor(); Func <object, object> queryBuilder = query => { return(this.CallIncludeMethod(query, propertyDescriptor)); }; lastQuery = this.ThenInclude(navTypeDescriptor, queryBuilder(lastQuery), typeDescriptor, queryBuilder); return(lastQuery); }