Реализация IQueryable.Count - PullRequest
       0

Реализация IQueryable.Count

1 голос
/ 23 ноября 2010

Я работаю с провайдером IQueryable. В моем IQueryProvider у меня есть следующий код:

public TResult Execute<TResult>(Expression expression)
{
    var query = GetQueryText(expression);

    // Call the Web service and get the results.
    var items = myWebService.Select<TResult>(query);

    IQueryable<TResult> queryableItems = items.AsQueryable<TResult>();
    return (TResult)queryableItems;
}

GetQueryText выполняет всю работу и обрабатывает строку запроса для дерева выражений. Это все работает хорошо, поэтому, где, OrderBy и Take отсортированы. Веб-сервис поддерживает запрос подсчета с использованием следующего:

int count = myWebService.Count(query);

Но я не могу разобраться, куда я положил это в IQueryable или IQueryProvider.

Я в основном работал с учебниками и примерами с открытым исходным кодом, но, похоже, не могу найти тот, который делает Count.

Ответы [ 2 ]

2 голосов
/ 23 ноября 2010

Вот серия статей о (предположительно довольно сложной) реализации IQueryable, которая выполняет Count (). Сам граф содержится в «Части X - Группировка по и агрегатам».

LINQ: Создание серии провайдеров IQueryable

0 голосов
/ 23 ноября 2010

Ответ кажется проще, чем я думал. Это сообщение в блоге помогло:

Метод Execute - это точка входа в ваш провайдер для фактического выполнения выражений запросов. Важно явное выполнение вместо того, чтобы просто полагаться на IEnumerable.GetEnumerator (), потому что оно позволяет выполнять выражения, которые не обязательно дают последовательности. Например, запрос «myquery.Count ()» возвращает одно целое число. Дерево выражений для этого запроса является вызовом метода Count, который возвращает целое число. Метод Queryable.Count (а также другие агрегаты и т. П.) Используют этот метод для выполнения запроса «прямо сейчас».

Я выполнил некоторую отладку, и для запроса myContext.Where(x => x.var1 > 5) вызывается Execute, а TResult является IEnumerable<MyClass>

Для myContext.Where(x => x.var1 > 5).Count() Вызывается Execute, а TResult является int

Так что мой метод Execute просто должен возвращаться соответствующим образом.

...