2009-04-12 11 views
12

Sto sviluppando un'applicazione che include un servizio WCF e il relativo client ASP.NET MVC. Il sito Web ASP.NET MVC deve visualizzare una griglia di oggetti, ad esempio prodotti. Questi prodotti sono archiviati in un database accessibile tramite il servizio WCF. Quindi da qualche parte all'interno di un controller MVC chiamo il metodo del servizio WCF che mi restituisce una serie di prodotti che ho bisogno di visualizzare.Implementazione del cercapersone tramite il servizio WCF

Quindi qual è la mia domanda? Voglio implementare una funzionalità cercapersone per la mia griglia di prodotti, perché è possibile che ci siano molti prodotti. Quindi ci sono diversi modi per farlo:

  1. mio regolatore può ottenere l'intero elenco dei prodotti e solo fare
  2. WCF può selezionare in memoria di paging tutti i prodotti e memorizzarli da qualche parte nella sua cache, quindi passare al controller solo una parte di essi, in base al numero di pagina richiesto.
  3. WCF può selezionare solo una parte dei prodotti dal database, in base al numero di pagina richiesto.
  4. WCF può restituire IQueryable al controller, quindi il controller selezionerà ciò che desidera ogni volta che lo desidera.

Per quanto ho capito (e correggo se non è vero), la prima opzione è inutile, quindi devo scegliere tra gli altri.

La seconda opzione spreca la memoria del mio server.

La terza opzione è OK, ma sembra un po 'brutto implementare il paging sul lato WCF.

E la quarta opzione suona confusa. In realtà passo una specie di query al client e poi interroga il mio database da solo, attraverso il servizio WCF. Non riesco a capire come implementarlo correttamente.

Quindi, per favore, puoi aiutarmi a scegliere il modo corretto di implementarlo?

risposta

15

Come è il livello del database di back-end? Se si utilizza LINQ (-to-SQL o -to-Entities), è possibile implementare il paging tramite WCF specificando le dimensioni della pagina e il numero di pagina desiderato, quindi utilizzare gli operatori "Skip" e "Take" di LINQ per il recupero la pagina richiesta - qualcosa di grosso modo così:

[ServiceContract] 
public interface IFetchData 
{ 
    [OperationContract] 
    public List<Data> GetData(int pageSize, int pageNumber) 
} 

e quindi implementare qualcosa di simile (semplificato):

public class FetchDataService : IFetchData 
{ 
    public List<Data> GetData(int pageSize, int pageNumber) 
    { 
     var query = yourContext.DataTable 
        .Skip((pageNumber - 1) * pageSize) 
        .Take(pageSize); 

     return query.ToList(); 
    } 
} 

Vorrei che sia utile per voi ??

Marc

+0

Sì, sto usando LINQ-to-SQL. Quindi quello che stai offrendo è in realtà la mia terza opzione. Beh, probabilmente ci andrò. Ho pensato ad una specie di esecuzione pigra, quando i servizi WCF passano IQueryable al client senza selezionare effettivamente dal db. Ma non riesco a capire come farlo –

+0

Bene, al momento, con le offerte attuali, penso che passare intorno a IQueryable potrebbe essere un po 'difficile da fare. Ma se controlli il video MIX'09 su "RIA Services" - questo è esattamente ciò che MS sta creando ora per Silverlight 3 - probabilmente risolverà tutti i tuoi problemi :-) –