LINQPad,使用多个数据上下文

我经常比较不同数据库中的表中的数据。 这些数据库不具有相同的模式。 在TSQL中,我可以使用DB> user> table结构(DB1.dbo.Stores,DB2.dbo.OtherPlaces)来引用它们来提取数据进行比较。 我非常喜欢LINQPad的概念,但我似乎无法轻易地从同一组语句中的两个不同的数据上下文中获取数据。

我已经看到人们build议简单地改变连接string以将数据从其他源拉入当前模式,但是,正如我所提到的,这是不行的。 我只是跳过常见问题页面吗? 这似乎是一个相当常规的程序,让我无法使用。

在“简单”的世界中,我希望能够简单地引用LINQPad创build的types化的数据上下文。 那么我可以简单地说:

DB1DataContext db1 = new DB1DataContext();

DB2DataContext db2 = new DB2DataContext();

并从那里工作。

更新 :现在可以在LINQPad中执行跨数据库SQL Server查询(来自LINQPad v4.31,带有LINQPad Premium许可证)。 要使用此function,请在将数据库从“模式资源pipe理器”拖动到查询窗口的同时按住Ctrl键。

也可以查询链接的服务器 (通过调用sp_add_linkedserver来链接)。 去做这个:

  1. 添加一个新的LINQ to SQL连接。
  2. select指定新build或现有数据库,然后select要查询的主数据库。
  3. 单击包含其他数据库checkbox,然后从列表中select链接的服务器。

请记住,你总是可以自己创build另一个上下文。

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

我不认为你能做到这一点。 看到这个LinqPad请求。

但是,您可以在单独的dll中创build多个dbml文件并在LinqPad中引用它们。

您可以根据需要实例化多个上下文以分离SQL实例并执行伪跨数据库连接,复制数据等。请注意,跨上下文的连接在本地执行,因此您必须调用ToList(),ToArray()等来执行查询在join之前分别使用各自的数据源。 换句话说,如果你“内部”从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=> ad, b=> (short?)b.Id, (a,b)=>new{b.Col1, b.Col2, a.Col1}) .Dump(); localContext.Database.Connection.Close(); localContext = null;