コード例 #1
0
        /// <summary>Gets database expression.</summary>
        /// <param name="context">The context.</param>
        /// <param name="type">The type.</param>
        /// <returns>The database expression.</returns>
        public override DbExpression GetDbExpression(DbContext context, Type type)
        {
            var contextFullName = context.GetType().AssemblyQualifiedName ?? context.GetType().FullName;
            var typeFullName    = type.AssemblyQualifiedName ?? type.FullName;
            var hookId          = QueryFilterManager.PrefixHook + contextFullName + ";" + typeFullName + ";" + UniqueKey;

            if (!QueryFilterManager.DbExpressionByHook.ContainsKey(hookId))
            {
                // CREATE set
                var setMethod = typeof(DbContext).GetMethod("Set", new Type[0]).MakeGenericMethod(type);
                var dbSet     = (IQueryable <T>)setMethod.Invoke(context, null);

                // APPLY filter
                dbSet = Filter(dbSet);

                // APPLY hook
                dbSet = QueryFilterManager.HookFilter(dbSet, hookId);

                // HOOK the filter
                var objectQuery = dbSet.GetObjectQuery();
                var commandTextAndParameters = objectQuery.GetCommandTextAndParameters();

                // ADD parameter
                QueryFilterManager.DbExpressionParameterByHook.AddOrUpdate(QueryFilterManager.DbExpressionByHook[hookId], commandTextAndParameters.Item2, (s, list) => list);
            }

            // TODO: WeakTable ?
            return(QueryFilterManager.DbExpressionByHook[hookId]);
        }
コード例 #2
0
        /// <summary>Gets database expression.</summary>
        /// <param name="context">The context.</param>
        /// <param name="type">The type.</param>
        /// <returns>The database expression.</returns>
        public override DbExpression GetDbExpression(DbContext context, Type type)
        {
            var contextFullName = context.GetType().AssemblyQualifiedName ?? context.GetType().FullName;
            var typeFullName    = type.AssemblyQualifiedName ?? type.FullName;
            var hookId          = QueryFilterManager.PrefixHook + contextFullName + ";" + typeFullName + ";" + UniqueKey;

            if (!QueryFilterManager.DbExpressionByHook.ContainsKey(hookId))
            {
                // CREATE set
                var setMethod = typeof(DbContext).GetMethod("Set", new Type[0]).MakeGenericMethod(type);
                var dbSet     = (IQueryable <T>)setMethod.Invoke(context, null);

                // APPLY filter
                dbSet = Filter(dbSet);

                // APPLY hook
                dbSet = QueryFilterManager.HookFilter(dbSet, hookId);

                // Hook the filter
                var objectQuery = dbSet.GetObjectQuery();
                objectQuery.ToTraceString();
            }

            // TODO: WeakTable ?
            return(QueryFilterManager.DbExpressionByHook[hookId]);
        }
コード例 #3
0
        /// <summary>
        ///     Filter the query using context filters associated with specified keys.
        /// </summary>
        /// <typeparam name="T">The type of elements of the query.</typeparam>
        /// <param name="query">The query to filter using context filters associated with specified keys.</param>
        /// <param name="keys">
        ///     A variable-length parameters list containing keys associated to context filters to use to filter the
        ///     query.
        /// </param>
        /// <returns>The query filtered using context filters associated with specified keys.</returns>
        public static IQueryable <T> Filter <T>(this IDbSet <T> query, params object[] keys) where T : class
        {
            var filterContext = QueryFilterManager.AddOrGetFilterContext(query.GetDbContext());
            var filterHook    = QueryFilterManager.EnableFilterById;

            var sb = new StringBuilder();

            if (keys != null)
            {
                foreach (var key in keys)
                {
                    var filter = filterContext.GetFilter(key);
                    if (filter == null)
                    {
                        continue;
                    }
                    sb.Append(filter.UniqueKey);
                    sb.Append(";");
                }
            }

            return(QueryFilterManager.HookFilter(query.AsNoFilter(), filterHook + sb));
        }
コード例 #4
0
 /// <summary>Return the orginal query before the context was filtered.</summary>
 /// <typeparam name="T">The type of elements of the query.</typeparam>
 /// <param name="query">The filtered query from which the original query should be retrieved.</param>
 /// <returns>The orginal query before the context was filtered.</returns>
 public static IQueryable <T> AsNoFilter <T>(this IDbSet <T> query) where T : class
 {
     return(QueryFilterManager.HookFilter(query, QueryFilterManager.DisableAllFilter));
 }