public IQueryable <T> Include <TProperty>(IQueryable <T> query, Expression <Func <T, TProperty> > expression) { ExpressionWrapper <T, M> wrapper = new ExpressionWrapper <T, M>(); LambdaExpression newExpression = (LambdaExpression)wrapper.Visit(expression); var propertyType = newExpression.Type.GetGenericArguments()[1]; var queryable = query.Unwrap <T, M>(); queryable = (IQueryable <M>)InnerContext.GetType().GetMethod("Include").MakeGenericMethod(propertyType).Invoke(InnerContext, new object[] { queryable, newExpression }); return(queryable.Wrap <T, M>()); }
public static IQueryable <M> Unwrap <T, M>(this IQueryable <T> queryable) where T : IEntity where M : IEntity, T { WrappedQueryable <T, M> wrapped = queryable as WrappedQueryable <T, M>; if (wrapped == null) { throw new NotSupportedException("不支持的类型。"); } WrappedQueryableProvider <T, M> provider = wrapped.Provider; var visitor = new ExpressionWrapper <T, M>(); var expression = visitor.Visit(wrapped.Expression); return(provider.InnerQueryProvider.CreateQuery <M>(expression)); }
private static Expression <Func <T, TResult> > UnwrapExpression <T, TResult>(Expression <Func <T, TResult> > expression, Type[] args) { ExpressionWrapper wrapper = new ExpressionWrapper(args[0], args[1]); return((Expression <Func <T, TResult> >)wrapper.Visit(expression)); }
protected virtual Expression <Func <M, TResult> > WrapExpression <TResult>(Expression <Func <T, TResult> > expression) { ExpressionWrapper <T, M> wrapper = new ExpressionWrapper <T, M>(); return((Expression <Func <M, TResult> >)wrapper.Visit(expression)); }