IQueryable
現在、Linq to NHibernate を使用して (この質問に関しては問題ではありません)、データベースに対してクエリを実行しており、現在の結果インスタンスが実行されたかどうかをテストできるようにしたいと考えています。
デバッガーは、結果プロパティを展開するとそれが「列挙」されることを通知するため、my が「呼び出されIQueryable
ていない」ことを認識しています。プログラムでそれを識別する方法もありますか。
それが理にかなっていることを願っています:)
次のような 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());
出力は次のとおりです。
False
String0
String1
...
True
Visual Studio を使用していると仮定すると、コードに挿入できDataContext.Log = Console.Out
ます。出力ウィンドウで、SQL が実行される様子を確認できます。
クエリが実行されたかどうかをプログラムでテストできるかどうかはわかりません。たとえば.ToList
、クエリを呼び出すことにより、強制的に実行できます。
DataContext.Logを使用して、実行されたすべてのログを記録できると思います。