Подтвердить что ты не робот

Как отладить выражение Linq Lambda?

Я использую Entity Framework и Linq для Entitites.

Я хотел бы знать, есть ли в Visual Studio 2012 способ отладки этого кода, шаг за шагом. В момент размещения точки останова курсор проходит над ней, но не входит внутрь.

Мне больше интересно видеть значение xe.. не sql, сгенерированный, например.

Примечания: я в порядке с использованием других инструментов или плагинов Visual Studio.

          IEnumerable<EventPushNotification> eventToPushCollage = eventsForEvaluation
                    .GroupJoin(eventCustomRepository.FindAllPushedEvents(),
                        e => e.Id,
                        p => p.PushedEventId,
                        (e, p) => new { e, p })
                     .Where(x => x.e.DateTimeStart > currentDateTime &&
                        currentDateTime >= x.e.DateTimeStart.AddMinutes(defaultReminders) &&     //  Data from default reminder for collage event in web.config  
                        x.p.Count() == 0)                                           // Check if the Event has not being already pushed
                     .Select(y => new EventPushNotification
                     {
                         Id = y.e.Id,
                         EventTitle = y.e.EventTitle,
                         DateTimeStart = y.e.DateTimeStart,
                         DateTimeEnd = y.e.DateTimeEnd,
                         Location = y.e.Location,
                         Description = y.e.Description,
                         DeviceToken = y.e.DeviceToken
                     });
4b9b3361

Ответ 1

Вы не можете отладить лямбда-выражение, если используете провайдера Linq to Entities.

Но вы можете посмотреть, на какой SQL он переводится. Также, если вы хотите потерпеть неудачу в производительности - вы можете загрузить все это в Linq для выполнения задач - и сделать шаг за шагом

Ответ 2

Убедитесь, что вы прочитали официальный документ MSDN по этому вопросу:

Отладка LINQ

и, пожалуйста, проголосуйте за это предложение на странице Voice Voice на Visual Studio:

Отладка лямбда-выражения

Allon Guralnek комментарий от 18 марта 2014 г. 12:37 о способе настройки точки останова только с клавиатуры:

@Anonymous: вы можете сделать это сегодня, установив точку останова внутри лямбда, что позволяет вам проверять каждое значение, которое приходит и из лямбды. Насколько я знаю, вы не можете установить точку останова внутри лямбда с помощью мыши, вы должны использовать клавиатуру. Поместите курсор внутри лямбда-тела (например, на первом токене или что-либо после = > и последующие пробелы), затем нажмите F9 (или любую комбинацию клавиш, которую вы используете для размещения точки останова). Только внутри выражение лямбда станет красным, и отладчик сломается там для каждого элемента оценивается лямбда (так что для массива из 100 элементов, используя .Where() приведет к тому, что точка останова достигнет 100 раз).

Здесь он в действии в моей текущей Visual Studio 2013:

enter image description here

Как вы можете видеть, он работает очень хорошо и позволяет нам видеть ценность тестируемого объекта. Это наверняка удивительный инструмент/спасатель!:)

Ответ 3

Вы можете добавить точки останова на любой ваш собственный код.

Итак, поставьте курсор на "x.e" и нажмите F9.

Ответ 4

Для будущих читателей это теперь включено в Visual Studio. Начиная с Visual Studio 2015 Preview, вы можете отлаживать выражение лямбда во время отладки. Все окна отладки, включая Watch, QuickWatch и Immediate, поддерживают оценку выражения лямбда. Вы можете прочитать об этом здесь.

Ответ 5

Нет никакого способа увидеть значения переменных x и e, потому что linq to orm не выполняется, он преобразуется/интерпретируется для генерации SQL-запроса.

Ответ 7

Я не знаю, как это происходит непосредственно в Visual Studio, но вы должны взглянуть на LinqPad: http://www.linqpad.net/

Ответ 8

Мне пришлось "Включить только мой код" в "Инструменты/Параметры/Отладка". Чтобы увидеть разные результаты между лямбда-методами, я добавил .ToList() между ними.

Ответ 9

Отладка запускается при вызове функции с лямбда-выражением, если вы используете ToList().

пример

bool aFunction(int x) { return x < 10; }
var l = new List<int>() { 5, 6, 11 }.Where(el => aFunction(el)).ToList();