2014-05-05 6 views
30

Ich habe das List<> Objekt wie unten geholt (mit .Include()):Expression kann nicht Lambda enthält Ausdrücke

List<vDetail> entityvDetails = 
    context.vDetails 
    .Include("payInstallment.appsDetail") 
    .Include("payInstallment.appsDetail.application") 
    .Include("payInstallment.appsDetail.purposes") 
    .Where(e => e.vch_id == 123).ToList(); 

Und dann irgendwo im Code voraus habe ich versucht, wie unten die Entitätsdatensatz zu filtern:

foreach (vDetail item in lstVDetails) 
{ 
    ... 

    int purposeId = entityvDetails.Where(e => e.sad_id == item.sad_id).FirstOrDefault().payInstallment.appsDetail.purposes.prp_id; 

    ... 
} 

Code kompilieren perfekt. Allerdings Rückkehr der Laufzeit folgende Fehler (obwohl alle Navigations enthalten sind):

Object reference not set to an instance of an object. 

Also habe ich für das Debuggen des Uhr-Fenster. Jetzt, während die Analyse der folgenden Anweisung in Ãœberwachungsfenster:

entityVoucherDetails.Where(e => e.sad_id == item.sad_id).FirstOrDefault() 

das Überwachungsfenster erzeugt folgende Fehlermeldung:

Expression cannot contain lambda expressions.

Bitte, wenn jemand kann mir sagen, was könnte der Grund sein?

+1

'FirstOrDefault' ausdrücklich erlaubt nullrefs. Wenn du sicher bist, dass es nie null ist, verwende "First". Führen Sie mehr Prüfungen für Nullref über mehrere Zeilen durch, bevor Sie annehmen, dass etwas nicht null ist. Wird auch beim Debuggen helfen. Weisen Sie das Ergebnis von 'entityvDetails.Where (e => e.sad_id == item.sad_id) .FirstOrDefault()' einer dedizierten Variablen zu. – BlueM

Antwort

57

Das Auswerten von Lambda-Ausdrücken im Debugger (Überwachungsfenster) wird noch nicht unterstützt.

Theres eine offene feature request dafür.

Zum Debuggen Ihres Problems sollten Sie das Ergebnis des Lambda-Ausdrucks einer dedizierten Variablen zuweisen und diese in folgenden Anweisungen verwenden.

var entity = entityvDetails.Where(e => e.sad_id == item.sad_id).FirstOrDefault(); 

-Update 08/2014: Microsoft hat ein Update veröffentlicht auf Antrag Merkmal der Ankündigung, dass sie daran zu arbeiten begonnen:

So here’s where we stand.

  • 1) We want this to work as much as you do. It’s not under review – it’s in progress.
  • 2) We figured out how to make it work; it simply requires rewriting everything.
  • 3) We’re rewriting everything.
  • 4) Rewriting everything takes a lot of time and a lot of testing.

-Update 11/2014 : Microsoft schließlich implementiert es mit einigen Einschränkungen in VS2015. Read here.

+10

Microsoft, wo IDE-Tools zum Umgang mit vorhandenen Sprachfunktionen als Extras gelten. – TugboatCaptain

+4

Unterstützung für das Debuggen von Lambda-Ausdrücken ist jetzt in Visual Studio 2015 enthalten. Prost. http://blogs.msdn.com/b/visualstudioalm/archive/2014/11/12/support-for-debugging-lambda-expressions-with-visual-studio-2015.aspx –

+0

@KhadimAli Ich habe Visual Studio 2015 und jetzt, im Jahr 2017, sehe ich immer noch diese Nachricht. Gibt es eine Art nicht automatisches Update oder ein Einstellungs-Flag, das ich umschalten muss? –

2

Wenn Sie weiterhin Visual Studio 2010 oder 2013 verwenden müssen, können Sie in der Paketmanagerkonsole Lambda-Ausdrücke verwenden. Weitere Einzelheiten finden Sie in meinem SO hier posten:

Why is it not possible to evaluate lambdas in the immediate window?

Dies ist der original source

+0

In Visual Studio 2012 bei Ausführung von PM> $ dte.Debugger.GetExpression ("orders.Where (o => o.IsValid == true)"); 'immer noch" _Value: ** Der Ausdruck darf keine Lambda-Ausdrücke enthalten ** _ ". Einzige Möglichkeit war es, ** für die Schleife zu laufen ** 'PM> für ($ i = 0; $ i -lt $ dte.Debugger.GetExpression (" orders.Count() "). Wert; $ i ++) {$ a = $ dte.Debugger.GetExpression ("orders [$ i]"); if ($ a.Value.IsValid -eq $ true) {Schreib-Host $ i ")" $ a.Value $ a.Value.IsValid}} '. – stomy