Как отладить выражение 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
});
Ответы
Ответ 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-запроса.
Ответ 6
Вы можете отлаживать лямбда-выражения в Visual Studio 2015.
http://blogs.msdn.com/b/visualstudioalm/archive/2014/11/12/support-for-debugging-lambda-expressions-with-visual-studio-2015.aspx
Ответ 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();