예제 #1
0
        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>());
        }
예제 #2
0
        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));
        }
예제 #3
0
        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));
        }
예제 #4
0
        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));
        }