【发布时间】:2010-09-08 12:33:27
【问题描述】:
我目前正在使用 Linq to NHibernate(尽管这不是关于这个问题的问题)对我的数据库执行查询,我希望能够测试当前的 IQueryable 结果实例是否已执行.
调试器知道我的IQueryable 没有被'调用',因为它告诉我扩展Results 属性将'枚举'它。有没有办法让我也以编程方式识别它。
我希望这是有道理的:)
【问题讨论】:
我目前正在使用 Linq to NHibernate(尽管这不是关于这个问题的问题)对我的数据库执行查询,我希望能够测试当前的 IQueryable 结果实例是否已执行.
调试器知道我的IQueryable 没有被'调用',因为它告诉我扩展Results 属性将'枚举'它。有没有办法让我也以编程方式识别它。
我希望这是有道理的:)
【问题讨论】:
如何编写这样的 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
...
是的
【讨论】:
假设您使用的是 Visual Studio,您可以将 DataContext.Log = Console.Out 插入到您的代码中。然后,您可以在输出窗口中观察 SQL 的执行情况。
我不确定是否可以以编程方式测试查询是否已执行。您可以强制它执行,例如通过在查询上调用 .ToList。
【讨论】:
我相信您可以使用DataContext.Log 记录所有执行的内容。
【讨论】: