我目前對NHibernate使用Linq(儘管對於這個問題來說這不是問題)對我的數據庫執行查詢,我希望能夠測試當前IQueryable結果實例已經執行或沒有。我如何測試我的Linq IQueryable已經執行
調試器都知道,我的IQueryable一直沒有「援引」,因爲它告訴我,擴大結果屬性將「枚舉」它。有沒有辦法讓我通過編程來識別。
我希望是有道理的:)
我目前對NHibernate使用Linq(儘管對於這個問題來說這不是問題)對我的數據庫執行查詢,我希望能夠測試當前IQueryable結果實例已經執行或沒有。我如何測試我的Linq IQueryable已經執行
調試器都知道,我的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());
輸出是:
假
String0
String1中
...
真
我相信你可以使用DataContext.Log記錄被執行的一切。
我實際上沒有DataContext,因爲我正在使用Linq到NHibernate。 – berko 2008-09-18 09:46:09
假設你使用的是Visual Studio,你可以在你的代碼中插入DataContext.Log = Console.Out
。然後,您可以在輸出窗口中查看SQL執行時的情況。
我不確定是否有可能以編程方式測試查詢是否已執行。您可以強制執行它,例如通過在查詢上調用.ToList
。
這似乎與任何解決方案一樣好。嗯......也許我可以封裝在一個擴展方法,所以我可以調用iQueryable.Monitor()(或類似的東西)。有趣。 – berko 2008-09-18 09:45:27