LinqPad,使用多个数据上下文 - DevForce

Posted

技术标签:

【中文标题】LinqPad,使用多个数据上下文 - DevForce【英文标题】:LinqPad, using multiple datacontexts - DevForce 【发布时间】:2012-05-21 09:26:47 【问题描述】:

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

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

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

    添加新的 LINQ to SQL 连接。 选择指定新数据库或现有数据库,然后选择要查询的主数据库。 单击“包括其他数据库”复选框并选择要包括的额外数据库。您还可以选择数据库 此对话框中的链接服务器。

Source

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

【问题讨论】:

【参考方案1】:

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

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

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

LINQPad 对 SQL Server 的跨数据库查询支持的特别之处在于,它可以通过简单地添加对另一个程序集的引用来完成您无法做到的事情,这是为了允许高效跨数据库通过利用服务器端连接进行查询。

【讨论】:

非常感谢。这肯定会有所帮助。【参考方案2】:

您可以根据需要实例化任意数量的上下文来分散 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)=>newb.Col1, b.Col2, a.Col1)
    .Dump();

localContext.Database.Connection.Close();
localContext = null;

【讨论】:

以上是关于LinqPad,使用多个数据上下文 - DevForce的主要内容,如果未能解决你的问题,请参考以下文章

csharp LINQPad脚本,用于获取有关当前所选数据库的基本架构信息(假设LINQPad的默认数据上下文创建方法)

csharp LINQPad脚本,用于获取有关当前所选数据库的基本架构信息(假设LINQPad的默认数据上下文创建方法)

在Microsoft Dynamic 365/2016环境使用LinqPad查询数据(不使用linqpad Microsoft Dynamic 365 Driver)

在LINQPad中使用FreeSql查询数据库

如何在 LinqPad 中提交更改

从LinqPad入门Linq