Lavorare con DataContext.GetTable () per ottenere un 'QueryProvider'
-
28-09-2019 - |
Domanda
Il metodo DataContext.GetTable () restituirà un oggetto di tipo:
System.Data.Linq.Table
Per fare ciò, presumo che non ho rilasciato una chiamata al database per recuperare l'intera tabella. In caso contrario, LINQ sarebbe un po 'inefficiente.
Quindi, tutto ciò che ho fatto è trapano nella mia classe fortemente tipizzato DataContext (ad esempio, dbDataContext) per afferrare una maniglia su, per esempio, la sua "I clienti" proprietà, che rappresenta la tabella Clienti in SQL Server.
I può quindi ottenere un IQueryable fuori l'oggetto restituito da GetTable () e ancora non hanno colpito il database. Vale a dire, il mio codice 'Service Layer' sarà LINQ to Objects, piuttosto che LINQ to SQL.
Per fare tutto questo, mi consentirà di ridurre il numero di repository che ho bisogno.
Domanda:
Sono le ipotesi di cui sopra sono corretti?
Nota:
Sto cercando di trovare un modo per costruire la mia query utilizzando interfacce e farmaci generici per rendere testabile e tutto ciò che dah doo.
Quindi, pensando lungo le linee di risposta di @ zowen a:
modelloRepository: Una classe repository per ogni entità
Sto cercando di implementare
public interface IQueryProvider<T>
{
TResult Query<TResult>(Func<IQueryable<T>, TResult> query);
}
Non so strettamente necessario, ma ho intenzione attraverso la curva di apprendimento e guardando le opzioni architettoniche che vestito me e come penso.
Quello che sto cercando di fare:
Sto cercando di implementare i seguenti per SQL Server invece di MongoDb:
public class MongoQueryProvider<T> : IQueryProvider<T>
{
private readonly IMongoCollection<T> collection;
public MongoQueryProvider(IMongoDatabase database)
{
this.collection = database.GetCollection<T>();
}
public TResult Query<TResult>(Func<IQueryable<T>, TResult> query)
{
return query(this.collection.Linq());
}
}
Quello che voglio è quello di ottenere una maniglia su GetTable () e poi scrivere il mio servizio strato di codice LINQ contro quella.
Ho il sospetto che dovrò scrivere un wrapper per un'interfaccia ottenere l'equivalente della variabile di database IMongoDatabase.
Tuttavia, la questione è quello di cui sopra, non questa altra questione. Come ho detto, sto solo imparando qui. Nessun codice di produzione sarà male in questo film.
Soluzione
La risposta breve alla tua domanda è che le vostre ipotesi sono corrette. Non si accede al database tramite il metodo GetTable<>()
del DataContext
. E, quando si ottiene un IQueryable
anche voi non accedere al database fino a quando si enumerano su di esso.
Inoltre, vedere se questo ti aiuta nella tua missione: vantaggio di creare un repository vs. specifica repository generico per ogni oggetto?