如何测试我的 Linq IQueryable 是不是已执行

Posted

技术标签:

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

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

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

我希望这是有道理的:)

【问题讨论】:

【参考方案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。

以上是关于如何测试我的 Linq IQueryable 是不是已执行的主要内容,如果未能解决你的问题,请参考以下文章

简单的 LINQ 连接以返回 IQueryable 对象集合

如何解决 - 无法使用Automapper将Generic.List强制转换为Linq.IQueryable?

并且找不到可接受类型为“System.Linq.IQueryable<MvcApplication1.Models.Student>”

如何检查 IQueryable<T>.Element 类型是不是为接口

如何将两个连接表中的 IQueryable LINQ 结果返回到 List<string> 中?

当我只需要计数而不读取 Document-Db 数据库中的所有文档时,如何使用 Linq 构造 IQueryable 查询?