Фильтрация коллекций в отладочных окнах Visual Studio

    Большинство .Net разработчиков знакомы с лямбда-выражениями (lambda expressions) и активно их используют. Однако при попытке использовать их в таких отладочных окнах как Watch / Immediate и Locals, Visual Studio сообщит нам о том, что “Expression cannot contain lambda expressions”. На это есть свои причины, и они очень подробно изложены в этих постах. К сожалению, в них также отсутствует информация о решении данной проблемы. В то время как разработчики каждый день сталкиваются с необходимость фильтрации коллекций в режиме отладки и поддержка лямбда-выражений значительно упростила бы их труд.


    Визуализаторы


    Самое первое решение появилось, как ни странно, ещё задолго до самих лямбда-выражений и основано на способе отображения отладочной информации в Visual Studio.

    Встроенный отладчик отображает значения переменных или объектов с помощью, так называемых визуализаторов – компонентов пользовательского интерфейса. Из коробки доступны 5 различных визуализаторов для работы с:
    1. Текстом;
    2. HTML;
    3. XML;
    4. Деревом визуальных компонентов WPF;
    5. Набором данных представленных объектами DataSet, DataView и DataTable.

    Некоторые из них могут не только отображать значения, но и редактировать их. К тому же это расширяемый механизм и разработчик может написать визуализатор с нужным ему функционалом.

    Поэтому первым решением была таблица данных, отображающая коллекцию объектов со всеми его свойствами и позволяющая настроить правила фильтрации с помощью коллекции преопределённых фильтров:



    Не самый удобный способ — открывать каждый раз отдельное окно для задания условий фильтрации, поэтому поиски продолжались.

    Entity SQL


    Годом позже, в процессе подготовки к сдаче экзамена 70-516: TS: Accessing Data with Microsoft .NET Framework 4 я внимательно изучал Entity SQL, о котором я до этого только слышал (если не считать опыта работы с HQL). Для тех, кто не в курсе, что это за зверь, приведу определение из MSDN:
    Entity SQL представляет собой независимый от хранилища язык, подобный языку SQL. Язык Entity SQL предназначен для запросов и управления большим количеством графов объектов, основанных на концептуальной модели.

    Т.е. в Entity Framework мы можем описать условие фильтрации в виде строки. Пример:
    using (var context = new CountriesEntities())
    {
        var countriesStartWithA = context.Countries.Where("it.Name LIKE 'A%'");
    }

    * This source code was highlighted with Source Code Highlighter.


    Object SQL


    Думаю вы уже догадались, что запись лямбда-выражений в строковом виде – способ обойти проблему с отладчиком Visual Studio. В итоге были написаны методы расширения (extension methods) для Linq-to-Object, принимающие на вход строковые фильтры. По аналогии с Entity SQL они были названы Object SQL. Достоинства и недостатки такого решения очевидны. Единственно, что я хотел бы отметить это альтернативный синтаксис. Дело в том, что у нас уже есть ещё один формат задания условий фильтрации в текстовом виде, используемый в протоколе OData. И приведённый выше фильтр можно было бы переписать как:
    using (var context = new CountriesEntities())
    {
        var countriesStartWithA = context.Countries.Filter("$filter=startswith(Name,'A')");
    }

    * This source code was highlighted with Source Code Highlighter.


    Честно говоря, я ждал поддержки лямбда-выражений вместе с релизом Visual Studio 2010, но увы. Поэтому приходится мириться с несовершенством рабочего инструмента и искать обходные пути.

    P.S.: Надеюсь товарищ outcoldman пролоббирует этот вопрос в команде разработчиков Visual Studio
    • +20
    • 1,4k
    • 7
    Поделиться публикацией

    Похожие публикации

    Комментарии 7

      0
      Как сдача экзамена, сдали? :)
        +2
        Спасибо, сдал)
          0
          а ни кто кстати 70-516 не сдавал недавно?
          0
          Согласен, но библиотека очень ограничена по сравнению с Entity SQL. В своё время так и не нашёл как с помощью неё сделать Startswith и написал ручную генерацию через expressions.
          +2
          Это огромная компания, это огромный продукт. Этот вопрос поднимался ни раз на сайте connect.microsoft.com, например, вот connect.microsoft.com/VisualStudio/feedback/details/472999/ability-to-evaluate-lambda-expressions-in-immediate-window

          Ребята из Debugging Team знают про него, но у них есть приоритеты по разработке. Когда-нибудь будет, но когда хз (так написано в ответе на коннект).

          А на приоритеты, сами понимаете, я влиять не могу, особенно удаленно. Когда буду уже на рабочем месте, то постараюсь поднять этот вопрос, когда познакомлюсь поближе с командой Debugger Team, самому интересно, почему до сих пор еще не реализовали.
            +1
            А на приоритеты, сами понимаете, я влиять не могу, особенно удаленно.

            Это понятно, просто вы единственный знакомый мне разработчик из команды разработки VS, читающий хабр)
            Когда буду уже на рабочем месте, то постараюсь поднять этот вопрос, когда познакомлюсь поближе с командой Debugger Team

            Отлично!)

          Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

          Самое читаемое