2013-08-29 16 views
6

Per il mio stage sto creando un programma che comunica con un database sullo sfondo. Il programma è stratificato nel modo MVC (Model-View-Controller).Classe di query Linq2Sql orientata agli oggetti

Per la vista voglio accedere ai dati tramite qualcosa che ho chiamato DataAccesLayer (DAL). Perché quella vista ha una conoscenza minima, voglio che passi un ID per la query che voglio chiamare. La chiamata verrà eseguita all'interno del DAL. Quindi con l'ID voglio chiedere una classe che trattiene le query per restituire la query per poi eseguirla all'interno del DAL. Immagine per la visualizzazione.

enter image description here

Il problema che ho ora è come eseguire la query nella mia funzione Read. Il codice per DAL è il seguente:

public class DataAccesLayer 
{ 
    private Queries queryloader; 
    private RoadsoftDigitacV8DataContext db; 

    public DataAccesLayer() 
    { 
     queryloader = new Queries(); 
     db = new RoadsoftDigitacV8DataContext(); 
    } 

    public List Read(int ID) 
    { 
     IQueryable query; 
     query = queryloader.GetQuery(ID); 

     return query.ToList(); 

    } 

} 

Il Codice per la classe Query:

public class Queries 
{ 
    private Dictionary<int, IQueryable object> queryDict; 
    private ErrorLoggerWinLog logger; 

    public Queries() 
    { 
     logger = ErrorLoggerWinLog.Instance(); 
     queryDict = new Dictionary<int, IQueryable object>(); 
     queryDict.Add(1, from d in db.Drivers 
         select d); 
    } 

    public object GetQuery(int ID) 
    { 
     var query; 
     if(queryDict.TryGetValue(ID, out query) == false) 
     { 
      logger.WriteLine("Queries", "Could not find the query specified", ErrorLoggerWinLog.loggerlevel.Error); 
     } 
     return query; 
    } 
} 

mi chiedo, è possibile? In questo momento non sembra funzionare. Probabilmente sto dimenticando qualcosa o mi manca qualcosa di importante. Qualcuno ha qualche esperienza con questo tipo di set-up, o dovrebbe guardare a una soluzione totalmente diversa?

Modifica: In questo momento non sembra eseguire la query, come se mi mancasse un comando nella funzione di lettura. Il Datacontext è riempito però, che viene fatto in una diversa sezione del programma.

Edit2: In questo momento sto esaminando il pattern IRepository, è una grande esperienza di apprendimento, grazie a tutti coloro che hanno preso tempo per commentare e anser!

+0

Buona sforzo con la domanda, +1 per immagine =] – Sean

+0

Tuttavia ..... Che cosa esattamente non funziona? – Sean

+0

È ancora necessario connettere l'oggetto contesto db al database effettivo. Come lo hai ora, hai un contesto non connesso. Quindi avresti bisogno di eseguire effettivamente la query attraverso il contesto. – ThaMe90

risposta

3

In qualsiasi momento il tuo queryDict ha un solo elemento; l'unica volta che GetQuery() non registra un messaggio di errore e non restituisce null è quando si passa 1 ad esso. di conseguenza Read(1) restituisce un elenco di tutti i driver, altrimenti genera un NullReferenceException perché, beh, query è nullo.

si dovrebbe usare qualcosa di simile a questo:

public class DriversDAL 
    { 
     private RoadsoftDigitacV8DataContext db; 

     public DriversDAL() 
     { 
      db = new RoadsoftDigitacV8DataContext(); 
     } 

     public Driver GetDriver(int ID) 
     { 
      return db.Drives.Single(d => d.ID == ID); 
     } 

    } 

Se si desidera una soluzione generica, è necessario utilizzare un dao generico e il modello Repository:

How To Create Generic Data Access Object (DAO) CRUD Methods with LINQ to SQL

Problemi correlati