2009-07-02 11 views
6

現在、LINQ-to-SQLを使用してさまざまなデータベースに依存する(したがって接続する)アプリケーションを開発しています。いずれかのデータベースでは、接続文字列が変更される可能性がありますが、このデータベースのスキーマはすべての接続文字列で同じです。DataContextテーブルまたはビューが存在するかどうかを簡単に検出する方法

構成可能な接続文字列のため、アプリケーションの起動時にDataContextを検証して、アプリケーションで使用するすべてのテーブルとビューを使用できるようにしたいと考えています。

オブジェクトDataContextTable<T>オブジェクトは、対応するSQLテーブルまたはビューにレコードがない場合でも、常に初期化されます。

だから。これは仕事をしながら

は、有効な値の決意が最終的にタイムアウトになり、かなりの時間を(各表のすべてのレコードをタッチする)、かかる
 bool valid = _dataContext.Articles.Count() > 0 
      && _dataContext.Customers.Count() > 0 
      && _dataContext.Orders.Count() > 0; 

次のように現在、妥当性チェックが行われます。だから、DataContextTable<T>が実際に対応するデータベースのテーブルとして存在するかどうかを判断するために、より高速で信頼性の高い方法がありますか?

+2

AのようにDataContext.ExecuteQueryメソッドを使用します小さな改善:Count()> 0の代わりにAny()拡張メソッドを使用してください。実際の質問には答えはありません。 –

+0

@Jørn - 私はそれがここの最良の選択だと思うので、答えとして投稿する必要があります... –

答えて

5

ここには(未テストの)考えがあります:

あなたのテーブルの名前をつかんでください。あなたは、ハードそれをコーディングしたり、

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

MyTableObjectTable<T>であなたのTableに含まれるLINQツーSQL生成物、すなわち、一般的なパラメータTある経由でプログラムでそれをつかむことができます。

TableAttributeSystem.Data.Linq.Mappingである。)

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

素晴らしい、これです。私はWHERE句を削除し、リストに結果を格納しました - 'var results'は一度しか列挙できませんでした。それでも、驚くほど速い。すばらしいです。 – dbaw

4

ジェイソンの答え上のわずかな変化(私は:)彼に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(); 
} 
関連する問題