2009-07-02 9 views
6

Actualmente, estoy desarrollando una aplicación que depende de (y por lo tanto se conecta a) varias bases de datos a través de LINQ-to-SQL. Para una de las bases de datos, la cadena de conexión puede variar y, por lo tanto, es configurable; sin embargo, el esquema de esta base de datos es idéntico para todas las cadenas de conexión.Forma rápida de detectar si existe una tabla o vista DataContext

Debido a la cadena de conexión configurable, quiero validar el DataContext durante el inicio de mi aplicación, para asegurarme de que todas las tablas y vistas que utiliza mi aplicación estén disponibles.

Los objetos Table<T> en el objeto DataContext siempre se inicializan, incluso si la tabla o vista SQL correspondiente no tiene ningún registro.

Entonces,. Actualmente, la comprobación de validación se realiza de la siguiente manera:

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

Si bien esto funciona, la determinación del valor del período de validez desde hace bastante tiempo (cada registro de cada tabla se toca), que finalmente resulta en un tiempo de espera . Entonces, ¿existe una manera más rápida y más confiable de determinar si realmente existe Table<T> de un cierto DataContext como una tabla en la base de datos correspondiente?

+2

Un pequeña mejora: utilice el método de extensión Any() en lugar de Count()> 0. Sin embargo, no es una respuesta a la pregunta real. –

+0

@ Jørn: deberías publicarlo como respuesta, ya que creo que es la mejor opción aquí ... –

Respuesta

5

Aquí es una (no probado) idea:

Grab el nombre de la tabla. Puede codificar duro en, o se puede agarrar mediante programación a través de

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

MyTableObject es el objeto LINQ a SQL generado contenida en su Table, es decir, el parámetro genérico T en Table<T>.

(TableAttribute está en System.Data.Linq.Mapping.)

utilizar el método de DataContext.ExecuteQuery como en

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

Genial, esto es todo. Eliminé la cláusula WHERE y almacené los resultados en una lista - 'var results' solo se pudo enumerar una vez. Aún así, increíblemente rápido. Estupendo. – dbaw

4

Un ligero cambio en la respuesta de Jason (Le di 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(); 
} 
Cuestiones relacionadas