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); }
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); }