Как я могу проверить, что мой Linq IQueryable выполнил - PullRequest
3 голосов
/ 11 сентября 2008

В настоящее время я использую Linq для NHibernate (хотя это не проблема в отношении этого вопроса) для выполнения запросов к моей базе данных, и я хочу иметь возможность проверить, был ли выполнен текущий экземпляр результата IQueryable или нет.

Отладчик знает, что мой IQueryable не был 'вызван' , потому что он говорит мне, что расширение свойства Results будет 'перечислять' его. Есть ли у меня способ программно идентифицировать это?

Надеюсь, это имеет смысл:)

Ответы [ 3 ]

1 голос
/ 17 сентября 2008

Как насчет написания оболочки 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
...
Правда

0 голосов
/ 17 сентября 2008

Если вы используете Visual Studio, вы можете вставить DataContext.Log = Console.Out в ваш код. Затем вы можете посмотреть SQL, как он выполняется, в окне вывода.

Я не уверен, возможно ли программно проверить, был ли выполнен запрос. Вы можете принудительно выполнить его, например, вызвав запрос .ToList.

0 голосов
/ 11 сентября 2008

Полагаю, вы можете использовать DataContext.Log для записи всего выполненного.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...