В настоящее время я использую Linq to NHibernate (хотя это не проблема в отношении этого вопроса) для выполнения запросов к моей базе данных, и я хочу иметь возможность проверить, был ли выполнен текущий экземпляр результата IQueryable или нет.
Отладчик знает, что мой IQueryable не был 'invoked', потому что он сообщает мне, что расширение свойства 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());
Выход:
Ложь
String0
String1
...
Истинный
Это кажется таким же хорошим решением, как и любое другое. Хммм ... может быть, я мог бы инкапсулировать это в методе расширения, чтобы я мог вызвать iQueryable.Monitor () (или что-то в этом роде). Интересно.
На самом деле у меня нет DataContext, поскольку я использую Linq для NHibernate.