Domanda

Diciamo che ho un modello di dominio con una classe chiamata Blog che ha una proprietà chiamata BlogEntries (che contiene oggetti di tipo BlogEntry). Se ho un modello di database con due tabelle "Blog" e "BlogEntry", non è impossibile avere 1000 post di blog per un blog. Se dovessi mostrare il blog su un sito web, vorrei solo mostrare 20 post di blog alla volta, quindi dovrei usare una sorta di paging. Ovviamente non voglio che vengano sempre recuperati 1000 record dal DB.

Come potrei farlo? La proprietà BlogEntries dovrebbe trovarsi anche nell'oggetto dominio Blog o forse nel repository? Mi piacerebbe ancora avere la possibilità di aggiungere voci di blog e ottenere un risultato di paginazione di quelli esistenti. Come sarebbe la mappatura di NHibernate?

La cosa Blog / BlogEntry è solo un esempio, potrebbe anche essere stata un esempio Cliente / Ordine o qualsiasi altro scenario principale / dettaglio.

Per favore, illuminami!

È stato utile?

Soluzione

Vorrei fare di BlogEntry la propria radice aggregata, con il proprio repository. Otterresti istanze BlogEntry per un determinato Blog interrogando il repository BlogEntry per tutti i BlogEntry che hanno un determinato BlogID. Non posso fornire dettagli specifici sul repository oltre a quello poiché esistono diverse strategie per l'implementazione di repository (un repository generico vs molti, metodi di ricerca separati vs uno che accetta un oggetto di specifica complesso, ecc.). Il metodo finder del repository dovrebbe supportare il paging.

public class Blog
{
    public int ID {get;set;}
    // other stuff
}

public class BlogEntry
{
    public int ID {get;set;}
    public int BlogID {get;set;}
}

public class BlogEntryRepository
{
    public IEnumerable<BlogEntry> FindByBlogID(
        int blogID, int pageIndex, int pageSize) 
    {
        // implementation
    }
}

In alternativa, (anche con BlogEntry modellato come radice aggregata) è possibile aggiungere una raccolta di BlogEntryID alla classe Blog. Sarebbe meglio che avere le stesse istanze BlogEntry nella classe Blog poiché avresti molti meno dati da caricare quando desideri ottenere un'istanza Blog. Con tali ID, è possibile selezionarne un sottoinsieme e passarli in un metodo di repository BlogEntry che accetta una raccolta di ID. In altre parole, ci sarebbe un po 'più di logica nel tuo dominio per supportare il paging e un getter più generico nel repository.

public class Blog
{
    public int ID {get;set;}
    public IEnumerable<int> BlogEntryIDs {get;set;}
    // other stuff
}

public class BlogEntry
{
    public int ID {get;set;}
    public int BlogID {get;set;}
}

public class BlogEntryRepository
{
    public IEnumerable<BlogEntry> Get(IEnumerable<int> blogEntryIDs) 
    {
        // implementation
    }
}

L'uso di questo approccio sarebbe come

// get the second page
var entries = 
  blogEntryRepo.Get(blog.BlogEntryIDs).Skip(1 * PAGE_SIZE).Take(PAGE_SIZE);

Nel database, si restituirebbero più righe, una per ogni post di blog. (Preferisco anche restituire più set di risultati per ottenere tutte le righe da tutte le tabelle correlate in un round trip di database. Uso anche la funzione ROW_VERSION di SQL 2005 per abilitare il paging del database.)

Preferisco generalmente il secondo metodo, a meno che l'uso tipico non mostri quantità proibitive di (ad esempio più di un paio di migliaia) di istanze BlogEntry associate a un Blog. Una serie di troppi int mi metterebbe in guardia dalle prestazioni e dalla memoria.

Altri suggerimenti

Devi accedere alla blogentry nel suo repository per ottenere un elenco di paging.

Modifica: perché downvote? È sbagliato?

Per la raccolta di post di blog è possibile utilizzare BatchSize . Ti permetterà di non selezionare tutta la raccolta dalla base di dati, solo i valori richiesti.

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