0

LINQPadのプレミアムバージョンを購入しました。DevForceモデルを使用してクロスデータベースクエリを実行することも可能だと思いました。

これを行うには2つの方法があります。最も簡単なのはドラッグアンドドロップアプローチです。Ctrlキーを押しながら、スキーマエクスプローラーからクエリエディターに追加のデータベースをドラッグします。クエリでこれらの追加のデータベースにアクセスするには、database.table表記を使用します(例:Northwind.Regions.Take(100))。クエリを実行するデータベースは、同じサーバー上に存在する必要があります。

2番目のアプローチは、接続プロパティダイアログでクエリする追加のデータベースを一覧表示することです。このダイアログでは、リンクサーバーからデータベースを選択することもできます。続行する方法は次のとおりです。

  1. SQL接続に新しいLINQを追加します。
  2. [新規または既存のデータベースの指定]を選択し、クエリするプライマリデータベースを選択します。
  3. [追加のデータベースを含める]チェックボックスをクリックして、含める追加のデータベースを選択します。このダイアログでは、リンクされたサーバーからデータベースを選択することもできます。

ソース

しかし、明らかに方法はありませんね。誰かこれの解決策はありますか?

4

2 に答える 2

2

クロスデータベースクエリは、同じサーバーまたはリンクサーバー上のデータベースを使用する標準のSQLServer接続でのみ機能します。主な理由は、サーバー側の参加を保証することです(そうしないと、参加するたびにテーブル全体がクライアントにプルバックされることになります)。

LINQPadに機能を追加して、任意のデータベース間クエリを許可することを検討しました。これは、クライアント側の参加でも役立つ場合があるためです。ただし、これをカスタムデータコンテキスト(DevForceやEntity Frameworkなど)で機能させるのは非常に難しいことが判明したため、この機能は「難しすぎるバスケット」になってしまいました。主な問題は、namespace / assembly/app.configの競合を処理することでした。

F4キーを押して、追加のデータコンテキストを含むアセンブリへの参照を追加することを妨げるものは何もないことに注意してください。もちろん、2番目のデータコンテキストを手動でインスタンス化する必要がありますが、それは大したことではありません。オートコンプリートは引き続き取得できます。また、別の接続を作成すると、ツリービューでそのスキーマを確認できます。そして機能的には、LINQPadがマルチ接続クエリをサポートしていれば、とにかくそれができあがります。

LINQPadのSQLServerに対するデータベース間クエリのサポートの特別な点は、別のアセンブリへの参照を追加するだけではできないことを実行できることです。これにより、サーバー側の結合を利用してデータベース間のクエリを効率的に実行できます。

于 2012-05-23T03:51:30.920 に答える
1

必要な数のコンテキストをインスタンス化して、SQLインスタンスを分離し、疑似データベース間結合、データのコピーなどを実行できます。コンテキスト間の結合はローカルで実行されるため、クエリを実行するにはToList()、ToArray()などを呼び出す必要があります。参加する前に、それぞれのデータソースを個別に使用します。つまり、DB1.TABLE1の10行とDB2.TABLE2の20行を「内部」結合する場合、Linqが結合を実行して関連/交差を返す前に、両方のセット(30行すべて)をローカルマシンのメモリにプルする必要があります。セット(例ごとに最大20行)。

//EF6 context not selected in Linqpad Connection dropdown
var remoteContext = new YourContext();
remoteContext.Database.Connection.ConnectionString = "Server=[SERVER];Database="
+ "[DATABASE];Trusted_Connection=false;User ID=[SQLAUTHUSERID];Password=" 
+ "[SQLAUTHPASSWORD];Encrypt=True;";
remoteContext.Database.Connection.Open();
var DB1 = new Repository(remoteContext);

//EF6 connection to remote database
var remote = DB1.GetAll<Table1>()
    .Where(x=>x.Id==123)
    //note...depending on the default Linqpad connection you may get 
    //"EntityWrapperWithoutRelationships" results for 
    //results that include a complex type.  you can use a Select() projection 
    //to specify only simple type columns
    .Select(x=>new { x.Col1, x.Col1, etc... })
    .Take(1)
    .ToList().Dump();  // you must execute query by calling ToList(), ToArray(),
              // etc before joining


//Linq-to-SQL default connection selected in Linqpad Connection dropdown
Table2.Where(x=>x.Id = 123)
    .ToList() // you must execute query by calling ToList(), ToArray(),
              // etc before joining
    .Join(remote, a=> a.d, b=> (short?)b.Id, (a,b)=>new{b.Col1, b.Col2, a.Col1})
    .Dump();

localContext.Database.Connection.Close();
localContext = null;
于 2014-02-01T06:35:29.767 に答える