2011-01-04 17 views
1

私はEntityFramework v4にいくつかのビジネスロジックをフックしようとしています。これを実行できる最良の場所は、クエリが実行される直前です。しかし、私は難易度のIQueryableは私のIQueryProviderを使用するようになってを抱えているIQueryProviderオーバーライド

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

は、私は単純に実行(式expr)へのメソッドフックを追加し、デフォルトIQueryProviderを上書きすることができるだろう期待していました(ObjectQueryオブジェクトにはProvider {}属性がありますが、これはgetであり、あらかじめ定義されたクラスインスタンスを返します)。 新しいクエリスタック全体(ObjectSet、ObjectContextなど)を記述することなく、この方法で独自のカスタムIQueryProviderを使用する方法はありますか?

EDIT

申し訳ありません:私は、可能な場合IQueryProviderを実装して1以外の任意の新しいクラスを追加する話ではありません。ラッパーは元本で結構ですが、私はラッパーをIObjectSetを実装するかのObjectQuery <T>をサブクラス化するつもりはないとしてのみからCreateQueryを最初に通過する上で使用されます:私が使用しているとして、この時点の後

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

ラッパー内の標準ObjectSetを使用すると、IQueryProviderは事前定義されたObjectSetに戻り、IQueryProviderはそれ以上の呼び出しをキャッチしません。

So:IQueryProviderを実装して使用する方法はありますか?ラッパーを追加せずにIQueryxxxオブジェクトのフルカスタムスタックを使用する必要がありますか?

答えて

1

はいただあなただけそう

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; } 
} 
のような照会可能オブジェクトを挿入する必要がありますからCreateQueryで照会可能プロバイダにフックやメソッド

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

を実行します

関連する問題