【问题标题】:IQueryProvider overrideIQueryProvider 覆盖
【发布时间】:2011-01-04 18:40:46
【问题描述】:

我正在尝试将一些业务逻辑挂接到 EntityFramework v4 上,而我能做到这一点的最佳位置是在查询运行之前。

我希望我能够覆盖默认的 IQueryProvider,只需在 Execute(Expression expr) 中添加一个方法挂钩:

    public TResult Execute<TResult>(Expression expression)
    {
        // Do stuff here.
        return this.BaseProvider.Execute<TResult>(expression);
    }

但是,我很难让 IQueryable 使用我的 IQueryProvider(ObjectQuery 对象有一个 Provider{} 属性,但它是 get; only 并返回一个预定义的类实例)。 有没有办法以这种方式使用您自己的自定义 IQueryProvider 而无需编写全新的查询堆栈(ObjectSet、ObjectContext 等)?

编辑

抱歉:如果可能的话,我不是在谈论添加任何新类,除了实现 IQueryProvider 的类。包装器原则上很好,但由于我无意实现 IObjectSet 或子类化 ObjectQuery,因此包装器只会在第一次通过 CreateQuery 时使用:

    public IQueryable<TElement> CreateQuery<TElement>(Expression expression)
    {
        return this.BaseProvider.CreateQuery<TElement>(expression);
    }

在此之后,由于我在包装器内使用标准 ObjectSet,IQueryProvider 将恢复为预定义的,并且我的 IQueryProvider 将不再捕获任何调用。

那么:有没有办法实现和使用 IQueryProvider 而无需尝试添加包装器,这会迫使我使用 IQueryxxx 对象的完整自定义堆栈?

【问题讨论】:

    标签: c# entity-framework-4


    【解决方案1】:

    是的,只需在 CreateQuery 和 Execute 方法中挂钩可查询的提供程序

    public object Execute(Expression expression)
    {
     //do stuff here
     return _queryable.Provider.Execute(expression);
    }
    

    你只需要像这样注入可查询的对象

    public class MyQueryable<T> : IOrderedQueryable<T>
    {
     public MyQueryable(IQueryable<T> toWrap)
      : this(equipment, Expression.Constant(equipment.AsQueryable()))
     {
     }
    
     public MyQueryable(IQueryable<T> toWrap, Expression expression)
     {
      Wrapped = toWrap;
      Provider = new MyProvider<T>(toWrap);
      Expression = expression;
     }
    
     public IEnumerator<TModel> GetEnumerator()
     {
      return Wrapped.GetEnumerator();
     }
    
     IEnumerator IEnumerable.GetEnumerator()
     {
      return GetEnumerator();
     }
    
     public Expression Expression { get; private set; }
    
     public Type ElementType
     {
      get { return typeof(T); }
     }
    
     public IQueryProvider Provider { get; private set; }
     internal IQueryable<T> Wrapped { get; set; }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-06-11
      • 2012-01-28
      • 2012-02-16
      • 1970-01-01
      • 1970-01-01
      • 2021-06-26
      • 2020-06-06
      相关资源
      最近更新 更多