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;
이것이 작동하는 동안 유효한 가치의 결정은 꽤 시간이 걸리며 (각 테이블의 모든 레코드가 터치 됨) 궁극적으로 시간이 초과됩니다. 따라서 더 빠르고 신뢰할 수있는 방법이 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);
다른 팁
Jason의 대답에 약간의 변화가 있습니다 (나는 그에게 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();
}