2008-09-11 11 views
3

'u çalıştırdığını nasıl test edebilirim Şu anda Linq to NHibernate (bu soruyla ilgili bir sorun olmamakla birlikte) veritabanına karşı sorguları yürütmek için kullanıyorum ve geçerli olup olmadığını test edebilmek istiyorum IQueryable sonuç örneği yürütüldü veya yapılmadı.Linq IQueryable'in

ayıklayıcı bunun Sonuçları özelliği genişleyen bunu 'numaralandırmak' olacağını söylüyor çünkü benim IQueryable olmuştur 'çağrılan' olmadığını bilir. Bunu da programlı olarak tanımlamanın bir yolu var mı?

Sana yürütüldüğünde her şeyi oturum açmak için DataContext.Log kullanabilirsiniz inanıyoruz anlamda :)

cevap

1

böyle bir IQueryable sarıcı yazma hakkında nasıl

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()); 

Çıktı geçerli::

Yanlış
String0
String1

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; } 
    } 
} 

Sonra bu gibi kullanabilirsiniz ...
True

+0

Bu, herhangi bir çözüm kadar iyi görünüyor. Hmmm ... belki bunu bir uzantı yöntemiyle kapsülleyebilirdim, böylece iQueryable.Monitor() (veya bunun gibi bir şey) diyebilirim. İlginç. – berko

0

yapar umuyoruz.

+0

Aslında NHibernate için Linq kullandığım için hiçbir DataContext var. – berko

0

Visual Studio'yu kullandığınızı varsayarak, kodunuza DataContext.Log = Console.Out ekleyebilirsiniz. Ardından, çıktı penceresinde SQL'i yürütüldüğü gibi izleyebilirsiniz.

Sorgunun yürütülüp yürütülmediğini programlı olarak test etmenin mümkün olup olmadığından emin değilim. Örneğin, sorguya .ToList numaralı telefonu arayarak zorlayabilirsiniz.