Schnelle Möglichkeit zu erkennen, ob eine Datacontext Tabelle oder Sicht vorhanden
-
21-08-2019 - |
Frage
Derzeit entwickle ich eine Anwendung, die auf abhängt (und damit eine Verbindung zu) verschiedenen Datenbanken über LINQ to SQL. Für eine der Datenbanken ist die Verbindungszeichenfolge variiert und kann so konfiguriert werden - aber das Schema der Datenbank ist für alle Verbindungszeichenfolgen identisch.
Aufgrund der konfigurierbaren Verbindungszeichenfolge, mag ich die Datacontext während des Anlaufs meiner Anwendung überprüfen, um sicherzustellen, dass alle Tabellen und Ansichten meine Anwendung verwendet, zur Verfügung.
Die Table<T>
Objekte im DataContext
Objekt werden immer initialisiert - auch wenn die entsprechende SQL-Tabelle oder Sicht keine Datensätze hat.
So dann. Derzeit wird die Gültigkeitsprüfung durchgeführt, wie folgt:
bool valid = _dataContext.Articles.Count() > 0
&& _dataContext.Customers.Count() > 0
&& _dataContext.Orders.Count() > 0;
Während diese Arbeit tut, erfolgt die Bestimmung des Wertes der gültigen einige Zeit (alle Datensätze jeder Tabelle berührt wird), was letztlich in einer Zeit führt aus. So gibt es eine schnellere, zuverlässigere Art und Weise, um zu bestimmen, ob ein Table<T>
eines bestimmten DataContext
wirklich als Tabelle in der entsprechenden Datenbank vorhanden ist?
Lösung
Hier ist eine (nicht getestet) Idee:
Nutzen Sie den Namen Ihrer Tabelle. Sie können es schwer Code in, oder Sie können es über
greifen programmatischTableAttribute attribute = (TableAttribute)typeof(MyTableObject)
.GetCustomAttributes(typeof(TableAttribute), true)
.Single();
string name = attribute.Name;
MyTableObject
ist das LINQ to SQL erzeugten Objekt in Ihrem Table
enthielt, das heißt, die generischen Parameter T
in Table<T>
.
( TableAttribute
ist in System.Data.Linq.Mapping
.)
Mit der DataContext.ExecuteQuery
Methode wie in
var db = new MyDataContext();
var results = db.ExecuteQuery<string>("SELECT name FROM dbo.sysobjects WHERE xtype = 'U'");
bool hasTable = results.Any(s => "dbo." + s == name);
Andere Tipps
Eine leichte Veränderung auf Jasons Antwort (ich gab ihm eine upvote:))
public bool TableExistsInDatabase<T>()
{
TableAttribute attribute = (TableAttribute)typeof(T)
.GetCustomAttributes(typeof(TableAttribute), true)
.Single();
var result = ExecuteQuery<bool>(
String.Format(
"IF OBJECT_ID('{0}', 'U') IS NOT NULL
SELECT CAST(1 AS BIT) ELSE
SELECT CAST(0 AS BIT)", attribute.Name));
return result.First();
}