C# LinqPad,使用多个数据上下文-DevForce
我买了LINQPad的高级版本。我认为也可以使用DevForce模型执行跨数据库查询 有两种方法可以做到这一点。最简单的是拖放 方法:按住Ctrl键同时拖动其他数据库 从架构资源管理器到查询编辑器。访问这些 查询中的其他数据库,请使用database.table表示法, e、 北风。地区。采取(100)。您查询的数据库必须 驻留在同一服务器上 第二种方法是列出要创建的额外数据库 在“连接属性”对话框中进行查询。此对话框还允许您 从链接服务器中选择数据库。以下是如何继续:C# LinqPad,使用多个数据上下文-DevForce,c#,linq,linqpad,devforce,C#,Linq,Linqpad,Devforce,我买了LINQPad的高级版本。我认为也可以使用DevForce模型执行跨数据库查询 有两种方法可以做到这一点。最简单的是拖放 方法:按住Ctrl键同时拖动其他数据库 从架构资源管理器到查询编辑器。访问这些 查询中的其他数据库,请使用database.table表示法, e、 北风。地区。采取(100)。您查询的数据库必须 驻留在同一服务器上 第二种方法是列出要创建的额外数据库 在“连接属性”对话框中进行查询。此对话框还允许您 从链接服务器中选择数据库。以下是如何继续: 添加新的LINQ到SQL
但显然没有办法,是吗?是否有此解决方案?跨数据库查询仅适用于标准SQL Server连接、同一服务器或链接服务器上的数据库。主要的基本原理是确保服务器端连接(否则,每次连接时都会将整个表拉回到客户机) 我已经考虑过向LINQPad添加一个特性,以允许任意的跨数据库查询,因为有时即使在客户端连接的情况下,它也会很有用。然而,将其用于自定义数据上下文(如DevForce或entityframework)是非常棘手的,因此该特性最终被置于“太难的篮子”中。一个主要问题是处理命名空间/assembly/app.config冲突 请记住,没有什么可以阻止您按F4键并添加对包含附加datacontext的程序集的引用。当然,您必须手动实例化第二个数据上下文,但这并不是什么大问题。您仍然可以获得自动完成,并且如果为其创建单独的连接,您仍然可以在树视图中看到其模式。从功能上讲,如果LINQPad支持多连接查询,那么不管怎样,这就是最终的结果
LINQPad对SQL Server的跨数据库查询支持的特殊之处在于,它只需添加对另一个程序集的引用,即可实现其他程序集无法实现的功能,即通过利用服务器端联接实现高效的跨数据库查询。跨数据库查询仅适用于标准SQL Server连接,数据库位于同一服务器或链接服务器上。主要的基本原理是确保服务器端连接(否则,每次连接时都会将整个表拉回到客户机) 我已经考虑过向LINQPad添加一个特性,以允许任意的跨数据库查询,因为有时即使在客户端连接的情况下,它也会很有用。然而,将其用于自定义数据上下文(如DevForce或entityframework)是非常棘手的,因此该特性最终被置于“太难的篮子”中。一个主要问题是处理命名空间/assembly/app.config冲突 请记住,没有什么可以阻止您按F4键并添加对包含附加datacontext的程序集的引用。当然,您必须手动实例化第二个数据上下文,但这并不是什么大问题。您仍然可以获得自动完成,并且如果为其创建单独的连接,您仍然可以在树视图中看到其模式。从功能上讲,如果LINQPad支持多连接查询,那么不管怎样,这就是最终的结果
LINQPad对SQL Server的跨数据库查询支持的特殊之处在于,它只需添加对另一个程序集的引用,就可以完成其他程序无法完成的任务,这是为了通过利用服务器端联接来实现高效的跨数据库查询。您可以根据需要实例化任意多个上下文,以分散SQL实例并执行伪跨数据库联接、复制数据等。注意,跨上下文的联接是在本地执行的,因此必须调用ToList()、ToArray(),etc在加入之前分别使用各自的数据源执行查询。换句话说,如果将DB1.TABLE1中的10行与DB2.TABLE2中的20行进行“内部”连接,则在Linq执行连接并返回相关/相交集(每个示例最多20行)之前,必须将这两个集(全部30行)拉入本地计算机上的内存中
//在Linqpad连接下拉列表中未选择EF6上下文
var remoteContext=newyourcontext();
remoteContext.Database.Connection.ConnectionString=“服务器=[Server];数据库=”
+“[DATABASE];Trusted_Connection=false;用户ID=[SQLAUTHUSERID];密码=”
+“[SQLAUTHPASSWORD];Encrypt=True;”;
remoteContext.Database.Connection.Open();
var DB1=新存储库(remoteContext);
//EF6到远程数据库的连接
var remote=DB1.GetAll()
.其中(x=>x.Id==123)
//注意…取决于您可能获得的默认Linqpad连接
//的“EntityWrapperWithoutRelationships”结果
//包含复杂类型的结果。可以使用Select()投影
//仅指定简单类型列的步骤
.Select(x=>new{x.Col1、x.Col1等…)
.采取(1)
.ToList().Dump();//必须通过调用ToList()、ToArray()执行查询,
//在加入之前
//在Linqpad连接下拉列表中选择Linq到SQL默认连接
表2.其中(x=>x.Id=123)
.ToList()//必须通过调用ToList()、ToArray()来执行查询,
//在加入之前
.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;
您可以实例化任意多个
//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;