如何拦截SELECT查询

时间:2015-07-24 21:53:23

标签: entity-framework entity-framework-core

我正在探索实体框架7,我想知道是否有办法拦截" SELECT"查询。每次创建,更新或删除实体时,我都会使用当前日期和时间标记实体。

SELECT * 
FROM MyTable
WHERE DeletedOn IS NOT NULL

我希望所有SELECT查询都排除已删除的数据(请参阅上面的WHERE子句)。有没有办法使用Entity Framework 7?

2 个答案:

答案 0 :(得分:3)

我不确定您的底层基础架构是什么样的,以及您的应用程序和实体框架之间是否有任何抽象。假设您正在使用DbSet<T>,您可以编写一个扩展方法来排除已删除的数据。

        public class BaseEntity
        {
                public DateTime? DeletedOn { get; set; }
        }
        public static class EfExtensions
            {
                public static IQueryable<T> ExcludeDeleted<T>(this IDbSet<T> dbSet) 
                    where T : BaseEntity
                {
                    return dbSet.Where(e => e.DeletedOn == null);
                }
            }
      //Usage
      context.Set<BaseEntity>().ExcludeDeleted().Where(...additional where clause).

答案 1 :(得分:0)

我有一些相同的问题。我试图拦截读取查询,如; select,where etc以查看返回的结果集。在EF Core中,不幸的是,你没有相应的覆盖SaveChanges来读取查询。

但是,您仍然可以通过使用

将实体框架核心挂钩到commandExecuting和commandExecuted
 var listener = _context.GetService<DiagnosticSource>();
(listener as DiagnosticListener).SubscribeWithAdapter(new CommandListener());

并使用以下两种方法创建一个类

   public class CommandListener
    {
        [DiagnosticName("Microsoft.EntityFrameworkCore.Database.Command.CommandExecuting")]
        public void OnCommandExecuting(DbCommand command, DbCommandMethod executeMethod, Guid commandId, Guid connectionId, bool async, DateTimeOffset startTime)
        {
            //do stuff. 
        }

        [DiagnosticName("Microsoft.EntityFrameworkCore.Database.Command.CommandExecuted")]
        public void OnCommandExecuted(object result, bool async)
        {
           //do stuff. 
        }
    }

然而,这些是高级别的lewel拦截器,因此您无法查看返回的结果集(在您的情况下使其无用)。

我建议两件事情,首先去实施&#34; Hooks的投票,以便在高层和低层动态拦截和修改查询&#34;在:https://data.uservoice.com/forums/72025-entity-framework-core-feature-suggestions/suggestions/1051569-hooks-to-intercept-and-modify-queries-on-the-fly-a

其次,您可以使用拦截器来使用PostSharp(商业产品); LocationInterceptionAspect on properties或OnMethodBoundaryAspect for methods。