it-swarm.com.de

Wie debuggen Sie einen Linq-Lambda-Ausdruck?

Ich benutze Entity Framework und Linq für Entitites.

Ich möchte gerne wissen, ob es in Visual Studio 2012 eine Möglichkeit gibt, diesen Code Schritt für Schritt zu debuggen ... Wenn Sie einen Haltepunkt setzen, wird der Cursor darüber gesetzt, tritt aber nicht hinein.

Ich bin mehr daran interessiert, den Wert von x.e ... zu sehen, nicht die generierte SQL.

Anmerkungen: Ich kann andere Tools oder Visual Studio-Plugins verwenden.

          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
                     });
22
GibboK

Sie können nicht ​​ debuggen einen Lambda-Ausdruck, wenn Sie einen Linq to Entities-Anbieter verwenden.

Sie können sich aber ansehen , in welches SQL es übersetzt. Auch wenn Sie bereit sind, einen Leistungseinbruch zu erleiden - Sie könnten alles in Linq laden, um Objekte zu erhalten - und Schritt für Schritt ausführen

8
Jens Kloster

Stellen Sie sicher, dass Sie das offizielle MSDN-Dokument zu diesem Thema lesen:

LINQ debuggen

und stimmen Sie für diesen Vorschlag auf der User Voice-Seite von Visual Studio ab:

Debug-Lambda-Ausdrücke

Allon Guralnek Kommentare zu 18. März 2014 12:37 PM über eine Möglichkeit, einen Haltepunkt nur mit der Tastatur festzulegen:

@Anonymous: Sie können dies heute tun, indem Sie einen Haltepunkt in der .__ setzen. Lambda, damit Sie jeden Wert überprüfen können, der in und .__ eingeht. aus dem Lambda. Soweit ich weiß, können Sie keinen Haltepunkt in .__ festlegen. Wenn Sie ein Lambda mit der Maus verwenden, müssen Sie die Tastatur verwenden. Setzen Sie den Cursor innerhalb des Lambda-Körpers (z. B. auf dem ersten Token oder etwas nach dem => und dem Leerzeichen, das folgt), drücken Sie dann die Taste F9 (oder die Tastenkombination, die Sie zum Platzieren eines Haltepunkts verwenden). Nur das Innere von Die Lambda-Anweisung wird rot und der Debugger bricht dort ab Für jedes Element wird der Lambda-Wert gegen (für ein Array von 100 Elementen wird die Verwendung von .Where () bewirkt, dass der Haltepunkt 100 Mal erreicht wird).

Hier ist es in Aktion in meinem aktuellen Visual Studio 2013:

enter image description here

Wie Sie sehen, funktioniert es ziemlich gut und lässt uns den Wert einer getesteten Eigenschaft erkennen. Dies ist sicherlich ein fantastisches Werkzeug/Lebensretter! :)

73

Sie können Ihrem eigenen Code Haltepunkte hinzufügen.

Setzen Sie den Cursor auf 'x.e' und drücken Sie F9.

5
Maarten

Für zukünftige Leser ist dies jetzt in Visual Studio enthalten. Ab der Visual Studio 2015-Vorschau können Sie jetzt während des Debuggens den Lambda-Ausdruck debuggen. Alle Debug-Fenster, einschließlich Watch, QuickWatch und Immediate, unterstützen die Auswertung von Lambda-Ausdrücken. Mehr über dieses erfahren Sie hier .

3
dotNET

Nein, es gibt keine Möglichkeit, Werte der Variablen x oder e anzuzeigen, da linq to orm nicht ausgeführt wird. Es wird übersetzt/interpretiert, um eine SQL-Abfrage zu generieren.

1
Rafal

Ich weiß nicht, wie man das direkt in Visual Studio anstellt, aber Sie sollten sich LinqPad ansehen: http://www.linqpad.net/

0
studert

Wenn Sie ToList () verwenden, wird die Debug-Run-Funktion mit Lambda-Ausdruck aufgerufen.

Beispiel

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

Ich musste "Nur meinen Code aktivieren" in "Tools/Optionen/Debugging ...". Um die unterschiedlichen Ergebnisse zwischen Lambda-Methoden zu sehen, habe ich .ToList () zwischen sie gestellt.

0