maneira rápida para detectar se uma tabela DataContext ou vista existe
-
21-08-2019 - |
Pergunta
Atualmente, estou desenvolvendo um aplicativo que depende (e, portanto, se conecta a) várias bases de dados via LINQ to SQL. Para um dos bancos de dados, a seqüência de conexão pode variar e é, portanto, configurável - no entanto, o esquema desta base de dados é idêntica para todas as seqüências de conexão.
Por causa da seqüência de conexão configurável, quero validar o DataContext durante a inicialização do meu aplicativo, para se certificar de que todas as tabelas e exibições meus aplicativo usa, estão disponíveis.
Os objetos Table<T>
no objeto DataContext
são sempre inicializado - mesmo se a tabela SQL correspondente ou exibição não temos registos.
Então. Atualmente, a verificação de validação é realizada da seguinte forma:
bool valid = _dataContext.Articles.Count() > 0
&& _dataContext.Customers.Count() > 0
&& _dataContext.Orders.Count() > 0;
Enquanto isso não funciona, a determinação do valor válido leva algum tempo (todos os registros de cada tabela é tocado), que resulta em um tempo fora. Assim, há uma maneira mais rápida, mais confiável para determinar se ou não um Table<T>
de um certo DataContext
realmente existe como uma tabela no banco de dados correspondente?
Solução
Aqui está um (não testado) ideia:
Grab o nome de sua tabela. Você pode codificar-lo, ou você pode agarrá-lo por meio de programação via
TableAttribute attribute = (TableAttribute)typeof(MyTableObject)
.GetCustomAttributes(typeof(TableAttribute), true)
.Single();
string name = attribute.Name;
MyTableObject
é o objeto gerado LINQ to SQL contidas no seu Table
, isto é, a T
parâmetro genérico em Table<T>
.
( TableAttribute
está em System.Data.Linq.Mapping
.)
Use o método DataContext.ExecuteQuery
como em
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);
Outras dicas
Uma pequena mudança na resposta de Jason (eu dei-lhe um 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();
}