2009-07-02 50 views
6

目前,我正在開發一個應用程序,該應用程序通過LINQ-to-SQL依賴(並因此連接到)各種數據庫。對於其中一個數據庫,連接字符串可能會有所不同,因此可以進行配置 - 但是,對於所有連接字符串,此數據庫的架構是相同的。快速檢測DataContext表或視圖是否存在

由於可配置的連接字符串,我想在我的應用程序啓動過程中驗證DataContext,以確保我的應用程序使用的所有表和視圖都可用。

對象中的Table<T>對象始終被初始化 - 即使對應的SQL表或視圖沒有任何記錄。

那麼。

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

雖然這工作,有效價值的確定需要相當長的時間(每個表的每一條記錄被觸摸),這最終導致超時:目前,按照如下進行驗證檢查。那麼,是否有更快,更可靠的方法來確定某個DataContextTable<T>是否確實作爲相應數據庫中的表存在?

+2

一小改進:使用Any()擴展方法而不是Count()> 0.不過,這並不是真正問題的答案。 – 2009-07-02 13:01:05

+0

@Jørn - 你應該將其作爲回答,因爲我認爲這是最好的選擇... – 2009-07-02 13:29:14

回答

5

這是一個(未經測試)的想法:

抓住你的表的名字。你可以把它硬代碼,也可以通過

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

MyTableObject編程抓住它是通用參數TTable<T>包含在你的Table,即LINQ到SQL生成的對象。

TableAttributeSystem.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);  
4

賈森的回答略有變化(我給了他一個給予好評:))

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(); 
}