/// <summary> /// Performs expression replacement and then delegates to the wrapped provider to create an /// <see cref="ObjectQuery" />. /// </summary> protected ObjectQuery CreateObjectQuery(Expression expression) { DebugCheck.NotNull(expression); expression = new DbQueryVisitor().Visit(expression); return((ObjectQuery)((IQueryProvider)_provider).CreateQuery(expression)); }
private static Expression CreateObjectQueryConstant(object dbQuery) { ObjectQuery objectQuery = DbQueryVisitor.ExtractObjectQuery(dbQuery); if (objectQuery == null) return (Expression) null; Type key = ((IEnumerable<Type>) objectQuery.GetType().GetGenericArguments()).Single<Type>(); Func<ObjectQuery, object> func; if (!DbQueryVisitor._wrapperFactories.TryGetValue(key, out func)) { func = (Func<ObjectQuery, object>) Delegate.CreateDelegate(typeof (Func<ObjectQuery, object>), typeof (ReplacementDbQueryWrapper<>).MakeGenericType(key).GetDeclaredMethod("Create", typeof (ObjectQuery))); DbQueryVisitor._wrapperFactories.TryAdd(key, func); } object obj = func(objectQuery); return (Expression) Expression.Property((Expression) Expression.Constant(obj, obj.GetType()), "Query"); }
private static DbContext GetContextFromConstantExpression( Expression expression, MemberInfo member) { if (expression == null) return DbQueryVisitor.GetContextFromMember(member, (object) null); ConstantExpression constantExpression = expression as ConstantExpression; if (constantExpression != null) { object obj = constantExpression.Value; if (obj != null) return DbQueryVisitor.GetContextFromMember(member, obj); } return (DbContext) null; }
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); }
protected ObjectQuery CreateObjectQuery(Expression expression) { expression = new DbQueryVisitor().Visit(expression); return((ObjectQuery)((IQueryProvider)this._internalQuery.ObjectQueryProvider).CreateQuery(expression)); }