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