50

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

我看到人们建议简单地更改连接字符串以将数据从其他源提取到当前架构中,但正如我所提到的,这不会。我只是跳过了常见问题解答中的一页吗?这似乎是一个相当常规的程序,我无法使用。

在“简单”的世界中,我希望能够简单地引用 LINQPad 创建的类型化数据上下文。然后我可以简单地:

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

并从那里工作。

4

6 回答 6

71

更新:现在可以在 LINQPad 中执行跨数据库 SQL Server 查询(来自 LINQPad v4.31,具有 LINQPad Premium 许可证)。要使用此功能,请在将数据库从模式资源管理器拖到查询窗口时按住 Control 键。

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

  1. 添加新的 LINQ to SQL 连接。
  2. 选择指定新数据库或现有数据库,然后选择要查询的主数据库。
  3. 单击包括附加数据库复选框并从列表中选择链接服务器。
于 2011-02-08T02:05:59.793 回答
8

请记住,您始终可以自己创建另一个上下文。

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());
}
于 2012-07-27T13:36:28.847 回答
5

您可以根据需要实例化任意数量的上下文来分散 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:29:56.850 回答
3

我不认为你能够做到这一点。请参阅此 LinqPad 请求。

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

于 2009-09-30T14:42:57.173 回答
3

拖放方法:按住 Ctrl 键的同时将其他数据库从 Schema Explorer 拖到查询编辑器中。

用例:

//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();
于 2019-04-05T09:30:38.953 回答
1

据我所知,多个数据库仅在 LinqPad 的“付费”版本中可用(我写的内容适用于 LinqPad 6 Premium)。

有关更多详细信息,请参阅StackOverflow 中的此答案“多数据库支持”部分)。

于 2021-08-13T12:46:55.873 回答