Come restituire primo oggetto di una collezione dal suo genitore
-
23-08-2019 - |
Domanda
Sto cercando di eseguire le seguenti operazioni con una sola query di database, se possibile.
public class Location
{
public string URL {get;set;}
public IList<Page> Pages {get;set;}
}
Page firstPage = Session.Linq<Location>()
.Where(location => location.URL == "some-location-url")
.Select(location => location.Pages).FirstOrDefault();
Il mio obiettivo è basato sulla corrente URL posizione, restituisce il primo oggetto pagina della sua collezione pagine.
Ho provato un certo numero di modi diversi ora e tutti sembrano per eseguire molte domande per ottenere l'oggetto desiderato Pagina fuori.
Ogni aiuto è apprezzato!
Dave Ninja
Soluzione
Questo potrebbe essere quello che cercate:
Page firstPage = Session.Linq<Page>()
.OrderBy(page => page.Index)
.FirstOrDefault(page=> page.Location.URL == "some-location-url");
Sto facendo l'ipotesi che la pagina ha una proprietà Posizione che si riferisce di nuovo alla posizione a cui appartiene e la .Index sarebbe la proprietà che si desidera ordinare con.
Altri suggerimenti
Eseguire la query contro Page
invece che contro Location
:. Non è necessario restituire il record di Location
a tutti
(from p in AllPages
where p.Location.URL == "some-location-url"
select p).FirstOrDefault();
[Quasi sempre quando mi si blocca con la scrittura di una query LINQ, trovo che aiuta a iniziare a costruire la query dal basso più oggetto che rientri nelle relazioni genitore-figlio coinvolti.]
Non potresti aggiungere un ordine dalla direttamente alla mappatura della collezione. Si potrebbe poi fare
Page firstPage = Session.Linq<Location>()
.Where(location => location.URL == "some-location-url")
.Select(location => location.Pages.FirstOrDefault()).FirstOrDefault();
Il FirstOrDefault può smettere NHibernate rendendo tutte le seleziona.
No Garanzia su questo LINQ come non ho avuto modo di impostare NHibernate fino a testarlo.