【问题标题】:How can I test that my Linq IQueryable has executed如何测试我的 Linq IQueryable 是否已执行
【发布时间】:2010-09-08 12:33:27
【问题描述】:

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

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

我希望这是有道理的:)

【问题讨论】:

    标签: c# linq


    【解决方案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());
    

    输出是:

    错误
    字符串0
    字符串1
    ...
    是的

    【讨论】:

    • 这似乎是一个很好的解决方案。嗯......也许我可以将它封装在一个扩展方法中,这样我就可以调用 iQueryable.Monitor() (或类似的东西)。很有趣。
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 我实际上没有 DataContext,因为我正在使用 Linq to NHibernate。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-13
      • 2017-04-21
      • 2015-11-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多