LINQ сквозной провайдер?

Я реализовал простой IQueryable а также IQueryProvider классы, которые собирают статистические данные о деревьях выражений LINQ. Эта часть отлично работает. Затем я хотел бы передать дерево выражений поставщику LINQ-to-Objects по умолчанию для оценки, поскольку мне не нужно выполнять его по-другому. Другими словами, я бы хотел, чтобы мой провайдер собирал статистику как побочный эффект, передавая запрос в реализацию LINQ по умолчанию.

Тем не менее, я испытываю трудности с получением справки для поставщика по умолчанию. Я думал, что я мог бы просто сохранить ссылку на оригинал IEnumerable коллекции, а затем вернуть поставщика по умолчанию (из моего IQueryable) лайк:

IQueryProvider IQueryable.Provider
{
    get { return _my_provider.OriginalIEnum().AsQueryable().Provider; }
}

но это не работает правильно. Код в конечном итоге бросает StackruException, Что я думаю, что происходит (почерпнутый из пошагового выполнения в режиме отладки), так это то, что среда выполнения LINQ выбирает провайдера из вышеуказанного метода, а затем извлекает дерево выражений из моего пользовательского интерфейса. IQueryable, а затем он замечает, что выражение верхнего уровня является моим обычаем IQueryable, Таким образом, он начинает процесс снова, пытаясь найти подходящего поставщика. Это происходит бесконечно, пока не произойдет переполнение стека.

Прямо сейчас, единственное, о чем я могу думать, - это найти другого посетителя, который создаст другое дерево выражений с пользовательским IQueryable узлы удалены, так что среда выполнения LINQ будет вызывать поставщика по умолчанию. Это большой объем работы, так как мне нужно посетить каждый лист, чтобы убедиться, что нет вложенных Call выражения, которые называют мой обычай IQueryable снова. Есть ли более простой подход?

Спасибо за помощь.

1 ответ

Решение

Оказывается, что настоящей проблемой здесь является именно то, что описано в выражении Pass LINQ для другого QueryProvider.

Другие вопросы по тегам