Arbeiten mit DataContext.GetTable () zu bekommen einen ‚Queryprovider‘
-
28-09-2019 - |
Frage
Die DataContext.GetTable () Methode wird ein Objekt des Typs zurückgeben:
System.Data.Linq.Table
Durch das zu tun, nehme ich an ich habe nicht einen Aufruf an die Datenbank ausgegeben, um die gesamte Tabelle abzurufen. Andernfalls würde LINQ etwas ineffizient sein.
Deshalb alles, was ich getan habe, ist Bohrer in meine stark typisierte Datacontext-Klasse (zB dbDataContext) auf einen Griff zu greifen, zum Beispiel seiner „Kunden“ Eigenschaft, die die Tabelle Customers in SQL Server darstellt.
Ich kann dann eine IQueryable aus dem von GetTable () zurückgegebene Objekt erhalten und noch nicht auf die Datenbank getroffen habe. Das heißt, mein ‚Service Layer‘ Code wird LINQ eher Objekte als Linq zu Sql.
Durch all dies tut, werde ich die Anzahl der Depots reduzieren, die ich brauche.
Frage:
Sind die obigen Annahmen korrekt?
Hinweis:
Ich versuche, einen Weg zu Figur meiner Abfragen zu bauen Schnittstellen und die Verwendung von Generika es testbar zu machen und alles, was doo dah.
So, entlang der Linien des Denkens @ Zowen Antwort auf:
Repository Muster: Eine Repository-Klasse für jede Entität
Ich versuche,
zu implementierenpublic interface IQueryProvider<T>
{
TResult Query<TResult>(Func<IQueryable<T>, TResult> query);
}
Ich weiß nicht unbedingt notwendig, aber ich werde durch die Lernkurve und Blick auf den architektonischen Möglichkeiten, dass Anzug mich und wie ich denke.
Was ich versuche zu tun:
Ich versuche, die folgenden für SQL Server anstelle von MongoDB zu implementieren:
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());
}
}
Was ich will, ist ein Griff auf GetTable () zu erhalten und dann mein Service Layer Linq Code dagegen schreiben.
Ich vermute, ich werde eine Wrapper-Schnittstelle schreiben das Äquivalent der IMongoDatabase Datenbankvariable zu erhalten.
Allerdings ist die Frage, die man oben, nicht das andere Problem. Wie ich schon sagte, lerne ich gerade hier. Kein Produktionscode wird in diesem Film verletzt werden.
Lösung
Die kurze Antwort auf Ihre Frage ist, dass Ihre Annahmen richtig sind. Sie Zugriff auf die Datenbank nicht durch die GetTable<>()
Methode des DataContext
. Und wenn Sie einen IQueryable
erhalten Sie auch Zugriff auf die Datenbank nicht, bis Sie darauf aufzuzählen.
Auch sehen, ob dies hilft Ihnen auf Ihrer Suche: Vorteil eine generische Repository vs. spezifische Repository für jedes Objekt zu schaffen?