web-dev-qa-db-ja.com

LINQPad、複数のデータコンテキストの使用

異なるデータベースのテーブルのデータを比較することがよくあります。これらのデータベースはnotが同じスキーマを持っています。 TSQLでは、DB>user>table構造体(DB1.dbo.StoresDB2.dbo.OtherPlaces)を使用してそれらを参照し、比較のためにデータをプルできます。 LINQPadのアイデアはかなり気に入っていますが、同じステートメントセット内の2つの異なるデータコンテキストからデータを簡単にプルすることはできません。

他のソースから現在のスキーマにデータをプルするために接続文字列を変更するだけだと人々が提案するのを見てきましたが、前述したように、これは行いません。 FAQのページをスキップしただけですか?これは私には利用できないかなり日常的な手順のようです。

「簡単な」世界では、LINQPadが作成する型指定されたデータコンテキストを簡単に参照できるようになりたいです。それから私は簡単にできました:

DB1DataContext db1 = new DB1DataContext();
DB2DataContext db2 = new DB2DataContext();

そして、そこから働きます。

48
Scott

pdate:LINQPadでデータベース間SQL Serverクエリを実行できるようになりました(LINQPad v4.31以降、LINQPad Premiumライセンスが必要です)。この機能を使用するには、Ctrlキーを押しながら、スキーマエクスプローラーからクエリウィンドウにデータベースをドラッグします。

リンクサーバーsp_add_linkedserverを呼び出してリンクした)をクエリすることもできます。これをする:

  1. 新しいLINQ to SQL接続を追加します。
  2. 新規または既存のデータベースを指定を選択し、クエリするプライマリデータベースを選択します。
  3. 追加のデータベースを含めるチェックボックスをクリックし、リストからリンクサーバーを選択します。
62
Joe Albahari

いつでも自分で別のコンテキストを作成できることに注意してください。

public FooEntities GetFooContext()
{
   var entityBuilder = new EntityConnectionStringBuilder        
               {        
                    Provider = "Devart.Data.Oracle",        
                    ProviderConnectionString = "User Id=foo;Password=foo;Data Source=Foo.World;Connect Mode=Default;Direct=false",
                    Metadata = @"D:\FooModel.csdl|D:\FooModel.ssdl|D:\FooModel.msl"     
                };

    return new FooEntities(entityBuilder.ToString());
}
8
Christoph

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;
4
Adam

あなたがこれを行うことができるとは思いません。 このLinqPadリクエストを参照してください。

ただし、別のdllで複数のdbmlファイルを作成して、LinqPadで参照することもできます。

4
Jeremy Roberts

ドラッグアンドドロップアプローチ:Ctrlキーを押しながら、追加のデータベースをスキーマエクスプローラーからクエリエディターにドラッグします。

使用事例:

//Access Northwind

var ID = new Guid("107cc232-0319-4cbe-b137-184c82ac6e12");

LotsOfData.Where(d => d.Id == ID).Dump();

//Access Northwind_v2

this.NORTHWIND_V2.LotsOfData.Where(d => d.Id == ID).Dump();
0