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

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top