示例#1
0
        public void CanTranslateThenFetchClause()
        {
            var session       = new Mock <ISession>();
            var executor      = new SpecificationExecutor();
            var specification = new WithThenFetch();
            var queryable     = executor.ExecuteSpecification(session.Object, specification);

            var thenFetchMethodInfo = ReflectionHelper.FindMethod(
                BindingFlags.Static | BindingFlags.Public,
                typeof(EagerFetchingExtensionMethods),
                nameof(EagerFetchingExtensionMethods.ThenFetch),
                null,
                new ArgumentConstraint(typeof(INhFetchRequest <,>), 1),
                new ArgumentConstraint(typeof(Expression <>).MakeGenericType(typeof(Func <,>)), 2));

            var lambda = (MethodCallExpression)queryable.Expression;

            Assert.Equal(ExpressionType.Call, lambda.NodeType);
            Assert.Same(
                thenFetchMethodInfo.MakeGenericMethod(typeof(User), typeof(Order), typeof(Address)),
                lambda.Method);

            Assert.Same(
                specification.Expression,
                ((UnaryExpression)lambda.Arguments.ElementAt(1)).Operand);
        }
示例#2
0
        public void CanTranslateThenFetchClause()
        {
            var context = new Mock <Context>();

            context
            .Setup(x => x.Set <User>())
            .Returns(new FakeSet <User>());

            var executor      = new SpecificationExecutor();
            var specification = new WithThenFetch();
            var queryable     = executor.ExecuteSpecification(context.Object, specification);

            var thenFetchMethodInfo = typeof(EntityFrameworkQueryableExtensions)
                                      .GetMethods(BindingFlags.Public | BindingFlags.Static)
                                      .Where(x => x.Name == nameof(EntityFrameworkQueryableExtensions.ThenInclude))
                                      .First(x =>
            {
                var arguments = x.GetParameters();
                var includableQuerySecondArguments = arguments.First().ParameterType.GetGenericArguments().ElementAt(1);
                return(!includableQuerySecondArguments.IsGenericType || !(typeof(IEnumerable <>).IsAssignableFrom(includableQuerySecondArguments.GetGenericTypeDefinition())));
            });

            var lambda = (MethodCallExpression)queryable.Expression;

            Assert.Equal(ExpressionType.Call, lambda.NodeType);
            Assert.Same(
                thenFetchMethodInfo.MakeGenericMethod(typeof(User), typeof(Person), typeof(byte[])),
                lambda.Method);

            Assert.Same(
                specification.Expression.Body,
                ((LambdaExpression)((UnaryExpression)lambda.Arguments.ElementAt(1)).Operand).Body);
        }