2016-11-25 1 views
-1

Ok, ich werde versuchen, dies sinnvoll zu machen.LINQ: Eine LISTE <> über mehrere Navigationen auffüllen

In einem Modell, Blei, unter anderen Eigenschaften, haben wir diese:

public class Lead 
{ 
    .... 
    public int LeadID {get; set; } 
    public virtual ICollection<QuoteRevision> QuoteRevisions { get; set; } 
    .... 
} 

Und QuoteRevision ...

public class QuoteRevision 
{ 
    .... 
    [ForeignKey(nameof(LeadID))] 
    public virtual Lead Lead { get; set; } 

    public virtual ICollection<QuoteRevisionProduct> QuoteRevisionProduct{ get; set; } 
    .... 
} 

Und das Modell für QuoteRevisionProduct:

public class QuoteRevisionProduct 
{ 
    .... 
    [ForeignKey(nameof(QuoteRevisionID))] 
    public virtual QuoteRevision QuoteRevision { get; set; } 

    [ForeignKey("ProductID")] 
    public virtual Product Product { get; set; } 
    .... 
} 

Und zuletzt ...

public class Product 
{ 
    .... 
    public string Code { get; set; } 
    .... 
} 

Ok. Das sind die Modelle, die ich abfragen muss, um ein Objekt namens QuoteSearchItem zu erstellen, das mehrere Eigenschaften hat. Hier sind zwei von ihnen:

public class QuoteSearchItem 
{ 
    .... 
    public LeadID {get; set; } 
    public List<string> Codes { get; set; } 
    .... 
} 

Ich fange mit diesem IQueryable aller Zeilen in Blei:

leads = IQueryable<Lead> 

Und dann dies zu tun:

var results = from l in leads 
    from qr in l.QuoteRevisions 
    from rp in qr.RevisionProducts 
    select new QuoteSearchItem 
    { 
     .... 
     LeadID = l.LeadID, 
     AdditionalProducts = ??? 
     .... 
    }; 

Ich bin nicht sicher, wie um diese Liste von Codes zu bekommen. Ich kann das tun:

Code = rp.Product.Code, 

Und das wird mir einen einzigen Code, der erste in der Liste. Aber wie bekomme ich alles, was dazu passt?

Ich weiß, das war eine Menge zu folgen. Ich hoffe es macht Sinn. Vielen Dank!

EDIT:

Dies ist (fast) die SQL, die ich suche:

SELECT 
    l.ID, 
    p.Code 
FROM 
    dbo.Leads AS l 
    JOIN QuoteRevisions qr ON qr.LeadID = l.ID 
    JOIN QuoteRevisionProducts qrp on qrp.QuoteRevisionID = qr.QuoteRevisionID 
    JOIN Products p on p.ProductID = qrp.ProductID 

Abgesehen davon, dass dies nur pro Produkt mehrere Zeilen zurückgeben. Aber es gibt zumindest eine Idee.

EDIT 2:

Code = l.QuoteRevisions.SelectMany(qr => qr.RevisionProducts).Select(p => p.Product.Code).ToList() 

Dieser keinen Fehler werfen, aber es ist eine Reihe von Daten für jeden Code zurückkehrt, was nicht, was ich brauche, ist.

+0

Können Sie nicht 'Codes = l.QuoteRevisions.SelectMany (qr => qr.SelectMany (qri => qri.QuoteRevisionProduct) .Wählen Sie (p => p.Code)' – KMoussa

+0

Kannst du das als Antwort? Qr Ich habe nicht SelectMany als Option, aber ich sehe, wohin Sie gehen. –

Antwort

1

können Sie SelectMany verwenden, um die Modelle zu glätten und alle Codes bekommen, so etwas wie diese:

var results = from l in leads  
select new QuoteSearchItem 
{ 
    .... 
    LeadID = l.LeadID, 
    Codes = l.QuoteRevisions.SelectMany(qr => qr.QuoteRevisionProduct) 
      .Select(p => p.Product.Code) 
    .... 
}; 

nicht sicher, wie Ihre DB aussieht, aber man kann wohl Distinct auch verwenden Duplikat zu beseitigen Codes

+0

Ok, wir sind in der Ri ght direction, aber ich bekomme einen Kompilierfehler auf qr.SelectMany (..).QuoteRevisions enthält keine Definition für 'SelectMany' –

+0

Ja, gerade aktualisiert, ich * denke * das sollte funktionieren, aber kann es im Moment nicht testen – KMoussa

+0

oh Mann, wir sind nah dran! Das ist nicht nur das, aber ich werde weiterspielen. –

Verwandte Themen