/// <summary>An IQueryable<T> extension method that includes.</summary> /// <typeparam name="T">Generic type parameter.</typeparam> /// <typeparam name="T2">Generic type parameter.</typeparam> /// <param name="source">The source to act on.</param> /// <param name="selector">The selector.</param> /// <param name="predicate">The predicate.</param> /// <returns>An IQueryable<T></returns> public static IQueryable <T> Include <T, T2>(this IQueryable <T> source, Expression <Func <T, IEnumerable <T2> > > selector, Func <T2, bool> predicate) where T : class where T2 : class { source = source.Include(selector); var includeOrderedQueryable = source as QueryIncludeQueryable <T>; ObjectQuery objectQuery; if (includeOrderedQueryable == null) { objectQuery = source.GetObjectQuery(); includeOrderedQueryable = new QueryIncludeQueryable <T>(source); } else { objectQuery = includeOrderedQueryable.ObjectQuery; } // Include includeOrderedQueryable.OriginalQueryable = includeOrderedQueryable.OriginalQueryable.Include(selector); // Include Filter var includeFilter = new QueryIncludeFilter <T, T2>() { selector = selector.Compile(), predicate = enumerable => enumerable.Where(predicate).ToList() }; includeOrderedQueryable.IncludeFilters.Add(includeFilter); return(includeOrderedQueryable); }
public static IQueryable <T> Include <T, T2>(this IQueryable <T> source, Expression <Func <T, IEnumerable <T2> > > selector, Func <IQueryable <T2>, IQueryable <T2> > includeQuery) where T : class where T2 : class { var context = source.GetObjectQuery().Context; var objectSetQuery = includeQuery(context.CreateObjectSet <T2>()); var includeQueryable = new QueryIncludeQueryable <T, T2>(source, selector, objectSetQuery); return(includeQueryable); }
public IQueryable <TElement> CreateQuery <TElement>(Expression expression) { if (typeof(TElement) == typeof(T)) { var query = (IQueryable <T>)OriginalProvider.CreateQuery <TElement>(expression); if (query is IOrderedQueryable <TElement> ) { var includeQuery = new QueryIncludeOrderedQueryable <T, T2>(query, IncludeQuery.Selector, IncludeQuery.IncludeQuery); return((IOrderedQueryable <TElement>)includeQuery); } else { var includeQuery = new QueryIncludeQueryable <T, T2>(query, IncludeQuery.Selector, IncludeQuery.IncludeQuery); return((IQueryable <TElement>)includeQuery); } } throw new Exception("not supported yet"); }
public QueryIncludeProvider(IQueryProvider provider, QueryIncludeQueryable <T, T2> includeQuery) { OriginalProvider = provider; IncludeQuery = includeQuery; }