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.
Können Sie nicht 'Codes = l.QuoteRevisions.SelectMany (qr => qr.SelectMany (qri => qri.QuoteRevisionProduct) .Wählen Sie (p => p.Code)' – KMoussa
Kannst du das als Antwort? Qr Ich habe nicht SelectMany als Option, aber ich sehe, wohin Sie gehen. –