protected override Expression VisitMember(MemberExpression node) { Check.NotNull<MemberExpression>(node, nameof (node)); PropertyInfo member = node.Member as PropertyInfo; MemberExpression expression = node.Expression as MemberExpression; if (member != (PropertyInfo) null && expression != null && (typeof (IQueryable).IsAssignableFrom(member.PropertyType) && typeof (DbContext).IsAssignableFrom(node.Member.DeclaringType))) { DbContext constantExpression = DbQueryVisitor.GetContextFromConstantExpression(expression.Expression, expression.Member); if (constantExpression != null) { Expression objectQueryConstant = DbQueryVisitor.CreateObjectQueryConstant(member.GetValue((object) constantExpression, BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, (Binder) null, (object[]) null, (CultureInfo) null)); if (objectQueryConstant != null) return objectQueryConstant; } } return base.VisitMember(node); }
protected override Expression VisitMethodCall(MethodCallExpression node) { Check.NotNull<MethodCallExpression>(node, nameof (node)); if (typeof (DbContext).IsAssignableFrom(node.Method.DeclaringType)) { MemberExpression memberExpression = node.Object as MemberExpression; if (memberExpression != null) { DbContext constantExpression = DbQueryVisitor.GetContextFromConstantExpression(memberExpression.Expression, memberExpression.Member); if (constantExpression != null && !node.Method.GetCustomAttributes<DbFunctionAttribute>(false).Any<DbFunctionAttribute>() && node.Method.GetParameters().Length == 0) { Expression objectQueryConstant = DbQueryVisitor.CreateObjectQueryConstant(node.Method.Invoke((object) constantExpression, BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, (Binder) null, (object[]) null, (CultureInfo) null)); if (objectQueryConstant != null) return objectQueryConstant; } } } return base.VisitMethodCall(node); }