2008-09-11 54 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
String1中
...

+0

這似乎與任何解決方案一樣好。嗯......也許我可以封裝在一個擴展方法,所以我可以調用iQueryable.Monitor()(或類似的東西)。有趣。 – berko 2008-09-18 09:45:27

0

我相信你可以使用DataContext.Log記錄被執行的一切。

+0

我實際上沒有DataContext,因爲我正在使用Linq到NHibernate。 – berko 2008-09-18 09:46:09

0

假設你使用的是Visual Studio,你可以在你的代碼中插入DataContext.Log = Console.Out。然後,您可以在輸出窗口中查看SQL執行時的情況。

我不確定是否有可能以編程方式測試查詢是否已執行。您可以強制執行它,例如通過在查詢上調用.ToList

相關問題