0

我已经购买了 LINQPad 的高级版。我认为也可以使用 DevForce 模型执行跨数据库查询。

有两种方法可以做到这一点。最简单的是拖放方法:按住 Ctrl 键的同时将其他数据库从 Schema Explorer 拖到查询编辑器中。要在查询中访问这些附加数据库,请使用 database.table 表示法,例如 Northwind.Regions.Take(100)。您查询的数据库必须位于同一台服务器上。

第二种方法是在连接属性对话框中列出要查询的额外数据库。此对话框还允许您从链接服务器中选择数据库。以下是如何进行:

  1. 添加新的 LINQ to SQL 连接。
  2. 选择指定新数据库或现有数据库,然后选择要查询的主数据库。
  3. 单击 Include Additional Databases 复选框,然后选择要包含的额外数据库。您还可以在此对话框中从链接服务器中选择数据库。

资源

但显然没有任何办法,不是吗?有人对此有解决方案吗?

4

2 回答 2

2

跨数据库查询仅适用于标准 SQL Server 连接、同一服务器或链接服务器上的数据库。主要理由是确保服务器端加入(否则,无论何时加入,您最终都会将整个表拉回客户端)。

我考虑向 LINQPad 添加一个功能以允许任意跨数据库查询,因为有时即使在客户端加入时它也会很有用。然而,让它与自定义数据上下文(例如 DevForce 或实体框架)一起工作变得非常棘手,因此该功能最终进入了“太难的篮子”。一个主要问题是处理命名空间/程序集/app.config 冲突。

请记住,没有什么可以阻止您按 F4 并添加对包含附加数据上下文的程序集的引用。当然,您必须手动实例化第二个数据上下文,但这应该不是什么大问题。您仍然会获得自动完成功能,并且如果您为其创建单独的连接,您仍然可以在树视图中看到其架构。从功能上讲,如果 LINQPad 支持多连接查询,这就是你最终会得到的结果。

LINQPad 对 SQL Server 的跨数据库查询支持的特别之处在于,它可以通过添加对另一个程序集的引用来完成您原本无法做到的事情,即通过利用服务器端连接来实现高效的跨数据库查询。

于 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 回答