4

我目前正在使用 Linq to NHibernate(尽管这不是关于这个问题的问题)来对我的数据库执行查询,并且我希望能够测试当前IQueryable结果实例是否已执行。

调试器知道 myIQueryable没有被“调用”,因为它告诉我扩展 Results 属性将“枚举”它。有没有办法让我也以编程方式识别它。

我希望这是有道理的 :)

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

输出是:


String0
String1
...

于 2008-09-17T17:41:36.000 回答
0

我相信您可以使用DataContext.Log记录执行的所有内容。

于 2008-09-11T05:27:02.570 回答
0

假设您使用的是 Visual Studio,您可以插入DataContext.Log = Console.Out到您的代码中。然后,您可以在输出窗口中观察 SQL 的执行情况。

我不确定是否可以以编程方式测试查询是否已执行。您可以强制它执行,例如通过调用.ToList查询。

于 2008-09-17T10:17:27.017 回答