4

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

デバッガーは、結果プロパティを展開するとそれが「列挙」されることを通知するため、my が「呼び出されIQueryableていない」ことを認識しています。プログラムでそれを識別する方法もありますか。

それが理にかなっていることを願っています:)

4

3 に答える 3

2

次のような 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

于 2008-09-17T17:41:36.000 に答える
0

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

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

于 2008-09-17T10:17:27.017 に答える
0

DataContext.Logを使用して、実行されたすべてのログを記録できると思います。

于 2008-09-11T05:27:02.570 に答える