2016-04-12 15 views
2

Ich habe einen Lambda-Ausdruck, den ich verkürzen möchte, indem ich zwei Funktionsaufrufe miteinander kombiniere. Wenn Sie in unten Code sehen, rufe ich this.adgroupRepository.GetBidRange zweimal. Es muss eine Möglichkeit geben, diese Aufrufe zu einer zu kombinieren und nur den FloorValue und den Deckenwert von innen zu übergeben.Komplexen Lambda-Ausdruck auswerten

Kann jemand helfen?

new JsonResult 
{ 
    Data = result.Data.Where(x => x.Bidding != null).Select(
     x => new 
     { 
      x.ID, 
      x.Name, 
      BidRange = new 
      { 
       FloorValue = (x.Bidding.FloorPrice != null) ? x.Bidding.FloorPrice : this.adgroupRepository.GetBidRange(this.contextProvider.CurrentAccount.CurrencyCode, x.PricingModel, x.Bidding.Type).FloorValue, 
       CeilingValue = (x.Bidding.CeilingPrice != null) ? x.Bidding.CeilingPrice : this.adgroupRepository.GetBidRange(this.contextProvider.CurrentAccount.CurrencyCode, x.PricingModel, x.Bidding.Type).CeilingValue 
      }, 
      DefaultBid = x.Bidding.BroadBid 
     }) 
}; 
+0

Eine Methode kann nur ein Objekt zurückgeben. Wenn die Methode GetBidRange() nur eine einzelne Zahl zurückgibt, kann der Code nicht geändert werden. Wenn Sie GetBidRange() ändern, um ein anderes Objekt wie KeyPairValue zurückzugeben, das zwei Zahlen zurückgeben kann, kann der Code einfacher sein. – jdweng

+2

@jdweng Es gibt bereits ein Objekt mit 'FloorValue' und' DeckenValue' darauf zurück. – Rawling

Antwort

4

Sie können immer eine Lambda-Anweisung anstelle eines Ausdrucks verwenden. Dadurch können Sie einen Codeblock schreiben, lokale Variablen erstellen und das Ergebnis zurückgeben. Sie können auch den nullverschmelzenden Operator ?? anstelle des bedingten Operators mit einer null Überprüfung verwenden.

new JsonResult 
{ 
    Data = result.Data.Where(x => x.Bidding != null).Select(
     x => 
     {     
      var bidRange = 
       x.Bidding.FloorPrice == null 
        || x.Bidding.CeilingPrice == null ? 
       this.adgroupRepository.GetBidRange(
        this.contextProvider.CurrentAccount.CurrencyCode, 
        x.PricingModel, 
        x.Bidding.Type) : 
       null; 
      return new 
      { 
       x.ID, 
       x.Name, 
       BidRange = new 
       { 
        FloorValue = x.Bidding.FloorPrice ?? bidRange.FloorValue, 
        CeilingValue = x.Bidding.CeilingPrice ?? bidRange.CeilingValue 
       }, 
       DefaultBid = x.Bidding.BroadBid 
      }; 
     }) 
}; 
+0

Ein kleiner Nachteil dieser Lösung ist, dass "GetBidRange" immer aufgerufen wird, auch wenn "x.Bidding.FloorPrice" und "x.Bidding.CeilingPrice" nicht null sind. – Henrik

+0

Danke für die schnelle Antwort Jungs. Gibt es eine Möglichkeit, dies mehr zu optimieren? d.h., GetBidRange nicht aufzurufen, wenn die Nicht-Null-Werte bereits vorhanden sind? –

+0

@ShubhamSrivastava Sicher, Sie können nur eine Bedingung setzen, die Sie nur aufrufen, wenn mindestens einer von ihnen null ist. Ich habe meine Antwort mit dem bedingten Operator aktualisiert, aber Sie können auch eine traditionelle 'if'-Anweisung verwenden. – juharr

1

So ähnlich?

new JsonResult 
{ 
     Data = result.Data.Where(x => x.Bidding != null).Select(x => 
     { 
      var bidRange = adgroupRepository.GetBidRange(
       contextProvider.CurrentAccount.CurrencyCode, 
       x.PricingModel, 
       x.Bidding.Type); 
      return new 
      { 
       ID = x.ID, 
       Name = x.Name, 
       BidRange = new 
       { 
        FloorValue = x.Bidding.FloorPrice ?? bidRange.FloorValue, 
        CeilingValue = x.Bidding.CeilingPrice ?? bidRange .CeilingValue 
       }, 
       DefaultBid = x.Bidding.BroadBid 
      } 
     }) 
}; 
+1

Sie müssen den anonymen Typ für die Kompilierung zurückgeben. – juharr

+0

@juharr Danke. Ich schrieb die Antwort von meinem Telefon .. Ich werde es aktualisieren. –