如何测试我的Linq IQueryable已执行
时间:2020-03-05 18:51:14 来源:igfitidea点击:
我目前正在使用Linq进行NHibernate(尽管这不是关于此问题的问题)对我的数据库执行查询,并且我希望能够测试当前IQueryable结果实例是否已执行。
调试器知道尚未"调用"我的IQueryable,因为它告诉我扩展Results属性将"枚举"它。我是否也有办法以编程方式识别这一点。
我希望这是有道理的 :)
解决方案
回答
我相信我们可以使用DataContext.Log来记录执行的所有内容。
回答
假设我们使用的是Visual Studio,则可以在代码中插入DataContext.Log = Console.Out
。然后,我们可以在输出窗口中查看SQL的执行情况。
我不确定是否可以以编程方式测试查询是否已执行。我们可以强制它执行,例如通过在查询中调用.ToList
。
回答
如何编写像这样的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
...
真的