LinqPad,使用多个datacontexts - DevForce

时间:2012-05-21 09:26:48

标签: c# linq linqpad devforce

我买了LINQPad的高级版本。我认为也可以使用DevForce模型执行交叉数据库查询。

  

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

     

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

     
      
  1. 添加新的LINQ to SQL连接。
  2.   
  3. 选择“指定新数据库”或“现有数据库”,然后选择要查询的主数据库。
  4.   
  5. 单击“包括其他数据库”复选框,然后选择要包含的其他数据库。您也可以从中选择数据库   此对话框中的链接服务器。
  6.   

Source

但显然没有任何办法,是吗?有人解决这个问题吗?

2 个答案:

答案 0 :(得分:2)

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

我考虑过向LINQPad添加一个功能以允许任意跨数据库查询,因为有时它甚至在客户端加入时也很有用。但是,让它与自定义数据上下文(例如DevForce或Entity Framework)一起工作变得非常棘手,因此该功能最终出现在“太难的篮子”中。一个主要问题是处理namespace / assembly / app.config冲突。

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

LINQPad对SQL Server的跨数据库查询支持有什么特别之处在于,它只是通过添加对另一个程序集的引用来实现您无法做到的事情,即允许高效跨数据库通过利用服务器端连接进行查询。

答案 1 :(得分: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;