A LINQ expression visitor that finds DbQuery uses with equivalent ObjectQuery instances.
Наследование: System.Linq.Expressions.ExpressionVisitor
Пример #1
0
        /// <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));
        }
Пример #2
0
 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");
 }
Пример #3
0
 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;
 }
Пример #4
0
 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);
 }
Пример #5
0
 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);
 }
Пример #6
0
 protected ObjectQuery CreateObjectQuery(Expression expression)
 {
     expression = new DbQueryVisitor().Visit(expression);
     return((ObjectQuery)((IQueryProvider)this._internalQuery.ObjectQueryProvider).CreateQuery(expression));
 }