2009-07-02 9 views
6

Attualmente sto sviluppando un'applicazione che dipende (e quindi si connette a) vari database tramite LINQ-to-SQL. Per uno dei database, la stringa di connessione può variare ed è quindi configurabile, tuttavia lo schema di questo database è identico per tutte le stringhe di connessione.Modo rapido per rilevare se esiste una tabella o una vista DataContext

A causa della stringa di connessione configurabile, voglio convalidare DataContext durante l'avvio della mia applicazione, per assicurarmi che tutte le tabelle e le viste che la mia applicazione utilizza siano disponibili.

Gli oggetti Table<T> nell'oggetto DataContext sono sempre inizializzati, anche se la tabella o vista SQL corrispondente non ha alcun record.

Quindi quindi. Attualmente, il controllo di convalida viene eseguita come segue:

 bool valid = _dataContext.Articles.Count() > 0 
      && _dataContext.Customers.Count() > 0 
      && _dataContext.Orders.Count() > 0; 

Anche se questo funziona, la determinazione del valore di validità acquisisce un bel po 'di tempo (ogni record di ogni tabella viene toccato), che alla fine si traduce in un time out . Quindi, esiste un modo più rapido e affidabile per determinare se uno DataContext esista o meno esattamente come una tabella nel database corrispondente?

+2

A piccolo miglioramento: usa il metodo di estensione Any() invece di Count()> 0. Non è una risposta alla domanda reale, però. –

+0

@ Jørn - dovresti postarlo come risposta, perché penso che sia l'opzione migliore qui ... –

risposta

5

Ecco un (non testata) idea:

Afferra il nome della tabella. È possibile difficile codificare in, oppure si può prendere a livello di codice tramite

TableAttribute attribute = (TableAttribute)typeof(MyTableObject) 
          .GetCustomAttributes(typeof(TableAttribute), true) 
          .Single(); 
string name = attribute.Name; 

MyTableObject è l'oggetto LINQ to SQL generato contenute nel vostro Table, vale a dire, il parametro generico T in Table<T>.

(TableAttribute è in System.Data.Linq.Mapping.)

utilizzare il metodo DataContext.ExecuteQuery come 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);  
+0

Grande, è proprio così. Ho rimosso la clausola WHERE e memorizzato i risultati in un elenco - "var results" poteva essere enumerato solo una volta. Ancora, incredibilmente veloce. Grande. – dbaw

4

Un leggero cambiamento sulla risposta di Jason (gli ho dato un 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(); 
} 
Problemi correlati