我买了LINQPad的高级版本。我认为也可以使用DevForce模型执行交叉数据库查询。
有两种方法可以做到这一点。最简单的是拖放 方法:在拖动其他数据库的同时按住Ctrl键 从Schema Explorer到查询编辑器。访问那些 查询中的其他数据库,使用database.table表示法, 例如,Northwind.Regions.Take(100)。您查询的数据库必须 驻留在同一台服务器上。
第二种方法是列出您想要的额外数据库 在连接属性对话框中查询。这个对话框也可以让你 从链接服务器中选择数据库以下是如何继续:
- 添加新的LINQ to SQL连接。
- 选择“指定新数据库”或“现有数据库”,然后选择要查询的主数据库。
- 单击“包括其他数据库”复选框,然后选择要包含的其他数据库。您也可以从中选择数据库 此对话框中的链接服务器。
醇>
但显然没有任何办法,是吗?有人解决这个问题吗?
答案 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;