Быстрый способ определить, существует ли таблица DataContext или представление
-
21-08-2019 - |
Вопрос
В настоящее время я разрабатываю приложение, которое зависит от различных баз данных (и, следовательно, подключается к ним) через LINQ-to-SQL.Для одной из баз данных строка подключения может отличаться и, таким образом, настраивается - однако схема этой базы данных идентична для всех строк подключения.
Из-за настраиваемой строки подключения я хочу проверить DataContext во время запуска моего приложения, чтобы убедиться, что все таблицы и представления, используемые моим приложением, доступны.
В Table<T>
объекты в DataContext
объекты всегда инициализируются - даже если соответствующая таблица SQL или представление не содержат никаких записей.
Итак, тогда.В настоящее время проверка достоверности выполняется следующим образом:
bool valid = _dataContext.Articles.Count() > 0
&& _dataContext.Customers.Count() > 0
&& _dataContext.Orders.Count() > 0;
Хотя это действительно работает, определение значения valid занимает довольно много времени (затрагивается каждая запись каждой таблицы), что в конечном итоге приводит к тайм-ауту.Итак, существует ли более быстрый и надежный способ определить, является ли Table<T>
из определенного DataContext
действительно существует в виде таблицы в соответствующей базе данных?
Решение
Вот (непроверенная) идея:
Введите название вашей таблицы.Вы можете жестко закодировать это, или вы можете захватить это программно с помощью
TableAttribute attribute = (TableAttribute)typeof(MyTableObject)
.GetCustomAttributes(typeof(TableAttribute), true)
.Single();
string name = attribute.Name;
MyTableObject
содержится ли сгенерированный LINQ-to-SQL объект в вашем Table
, т.е. общий параметр T
в Table<T>
.
(TableAttribute
находится в System.Data.Linq.Mapping
.)
Используйте DataContext.ExecuteQuery
метод, как в
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);
Другие советы
Небольшое изменение в ответе Джейсона (я поддержал его :))
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();
}