2016-11-28 15 views
0

Я пытаюсь захватить результаты запроса из выражений linq, отправленных в DataContext (Devart.Data.Linq). Я могу записывать запросы, используя свойство Log, но еще не нашел способ перехватить результаты IQueryable.Перехват результатов LINQ to SQL

Цель состоит в том, чтобы связать запросы и результаты вместе, сериализовать их и использовать их позже для издевательств в контексте данных в тестовом наборе.

Все методы Devart.Data.Linq.DataContext, которые выглядят многообещающими (ExecuteQuery, Query), не являются виртуальными, поэтому я не могу переопределить их для хранения результатов. Я не хочу записывать результаты в том месте, где написаны запросы linq, поскольку это будет очень грязно и означать вставку в тестовом коде в приложении.

+0

Я не уверен, что я понимаю, почему бы просто не повторять «IQueryable» или использовать «ToList» для получения результатов? – juharr

+0

@Hogan Я понимаю, что OP хочет получить сгенерированный запрос, который они получают, и результаты, поэтому я запутался. – juharr

+0

@juharr (ваш первый вопрос) Это было бы в том месте, где был написан запрос linq. Я хочу получить результаты в другом месте. Например, я надеялся расширить DataContext и каким-то образом захватить результаты на промежуточном этапе. Возможно, это невозможно, и мой вопрос не имеет смысла. – charliemango

ответ

0

В конечном итоге я нашел обходной способ перехвата обоих запросов и результатов путем обертывания как DataContext, так и содержащихся в нем IQueryables. Это потребовало внедрения пользовательского IQueryable и IQueryProvider. Хорошим примером является https://blogs.msdn.microsoft.com/alexj/2010/03/01/tip-55-how-to-extend-an-iqueryable-by-wrapping-it/ Как только это было сделано, удалось получить результаты запросов в методе overriden IQueryProvider.Execute. Привлечение связанного SQL, созданного ORM, потребовало отслеживания свойства DataContext.Log для изменений до и после выполнения запроса.