2012-05-21 73 views
0

我已经买了高级版本的LINQPad。我认为使用DevForce模型也可以执行交叉数据库查询。LinqPad,使用多个datacontexts - DevForce

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

第二种方法是在连接属性对话框中列出您想要查询的额外数据库。该对话框还可让您从连接的服务器中选择数据库。以下是如何继续:

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

Source

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

回答

2

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

我曾考虑过向LINQPad添加一项功能以允许任意的跨数据库查询,因为有时即使在客户端连接时也是如此。然而,让这个与自定义数据上下文(比如DevForce或Entity Framework)一起工作的结果非常棘手,所以这个特性最终成为了“太硬的篮子”。一个主要的问题是处理命名空间/程序集/ app.config冲突。

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

什么特别的LINQPad的跨数据库查询SQL Server的支持是它加入到另一个程序集,这也是为了让高效跨数据库查询通过利用服务器的引用做一些事情,你不能以其他方式做简单边加入。

+0

非常感谢。这肯定会有帮助。 –

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;