2008-09-11 26 views
3

私は現在、私のデータベースに対してクエリを実行するためにNHibernateにLinqを使用しています(これは問題はありません) IQueryable結果インスタンスが実行されたかどうか。私はLinq IQueryableが実行されたことをどのようにテストすることができます

デバッガが私のIQueryableがされていないことを知っている、それはます「列挙」それを結果プロパティを拡大することを私に伝えますので「を呼び出しました」。私もそれをプログラム的に特定する方法はありますか?

私はそれが理にかなって願っています:)

答えて

1

どのようにこのようなのIQueryableラッパーを書くことについて:

class QueryableWrapper<T> : IQueryable<T> 
{ 
    private IQueryable<T> _InnerQueryable; 
    private bool _HasExecuted; 

    public QueryableWrapper(IQueryable<T> innerQueryable) 
    { 
     _InnerQueryable = innerQueryable; 
    } 

    public bool HasExecuted 
    { 
     get 
     { 
      return _HasExecuted; 
     } 
    } 

    public IEnumerator<T> GetEnumerator() 
    { 
     _HasExecuted = true; 

     return _InnerQueryable.GetEnumerator(); 
    } 

    System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() 
    { 
     return GetEnumerator(); 
    } 

    public Type ElementType 
    { 
     get { return _InnerQueryable.ElementType; } 
    } 

    public System.Linq.Expressions.Expression Expression 
    { 
     get { return _InnerQueryable.Expression; } 
    } 

    public IQueryProvider Provider 
    { 
     get { return _InnerQueryable.Provider; } 
    } 
} 

その後、あなたはこのようにそれを使用することができます:

var query = new QueryableWrapper<string>(
    from str in myDataSource 
    select str); 

Debug.WriteLine("HasExecuted: " + query.HasExecuted.ToString()); 

foreach (string str in query) 
{ 
    Debug.WriteLine(str); 
} 

Debug.WriteLine("HasExecuted: " + query.HasExecuted.ToString()); 

出力は次のとおりです。


String0
文字列1
...
True

+0

これはすべてのソリューションと同じように優れているようです。うーん...おそらく、これを拡張メソッドでカプセル化してiQueryable.Monitor()(またはそのようなもの)を呼び出すことができます。面白い。 – berko

0

私はあなたが実行され、すべてをログに記録するDataContext.Logを使用することができると信じています。

+0

私はLinqをNHibernateに使用しているので、実際にはDataContextはありません。 – berko

0

Visual Studioを使用していると仮定すると、DataContext.Log = Console.Outをコードに挿入できます。出力ウィンドウで、実行されているSQLを見ることができます。

クエリが実行されたかどうかをプログラムでテストできるかどうかはわかりません。たとえば、クエリで.ToListを呼び出すなどして、強制的に実行することができます。

関連する問題