LINQPad,使用多个数据上下文

kxkpmulp  于 2022-12-20  发布在  其他
关注(0)|答案(6)|浏览(146)

我经常比较不同数据库的表中的数据。这些数据库具有相同的模式。在TSQL中,我可以使用DB>user>table结构(DB1.dbo.StoresDB2.dbo.OtherPlaces)引用它们,以提取数据进行比较。我非常喜欢LINQPad的想法,但我似乎无法在同一组语句中轻松地从两个不同的数据上下文提取数据。
我看到有人建议简单地修改连接字符串,将数据从其他数据源拉入当前模式,但正如我提到的,这是行不通的。我是否跳过了FAQ中的一页?这似乎是一个相当常规的过程,我无法使用。
在"简单"的世界里,我希望能够简单地引用LINQPad创建的输入数据上下文,然后我就可以简单地:

DB1DataContext db1 = new DB1DataContext();
DB2DataContext db2 = new DB2DataContext();

从那里开始工作。

7y4bm7vi

7y4bm7vi1#

更新:现在可以在LINQPad中执行跨数据库SQL Server查询(从LINQPad v4.31开始,使用LINQPad Premium许可证)。要使用此功能,请按住Ctrl键,同时将数据库从架构资源管理器拖到查询窗口。

还可以查询 * 链接服务器 *(您通过调用sp_add_linkedserver链接的服务器)。
1.添加新的LINQ到SQL连接。
1.选择指定新数据库或现有数据库并选择要查询的主数据库。
1.单击包括其他数据库复选框,然后从列表中选择链接服务器。

oiopk7p5

oiopk7p52#

请记住,您始终可以自己创建另一个上下文。

public FooEntities GetFooContext()
{
   var entityBuilder = new EntityConnectionStringBuilder        
               {        
                    Provider = "Devart.Data.Oracle",        
                    ProviderConnectionString = "User Id=foo;Password=foo;Data Source=Foo.World;Connect Mode=Default;Direct=false",
                    Metadata = @"D:\FooModel.csdl|D:\FooModel.ssdl|D:\FooModel.msl"     
                };

    return new FooEntities(entityBuilder.ToString());
}
byqmnocz

byqmnocz3#

您可以根据需要示例化任意数量的上下文以使其与不同的SQL示例相关联,并执行伪跨数据库连接、复制数据等。请注意,跨上下文连接是在本地执行的,因此您必须调用ToList(),指向数组()等,以便在连接之前使用它们各自的数据源单独执行查询。换句话说,如果您将DB1.TABLE1中的10行与DB2.TABLE2中的20行进行“内部”连接,在Linq执行连接并返回相关/相交集(每个示例最多20行)之前,必须将两个集(全部30行)拉入本地计算机的内存中。

//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();
        
remoteContext.Database.Connection.Close();
remoteContext = null;
t3psigkw

t3psigkw4#

我认为您无法做到这一点。请参见this LinqPad request.
但是,您可以在单独的dll中构建多个dbml文件,并在LinqPad中引用它们。

jmo0nnb3

jmo0nnb35#

拖放方法:按住Ctrl键,同时将其他数据库从架构管理器拖到查询编辑器。
使用案例:

//Access Northwind

var ID = new Guid("107cc232-0319-4cbe-b137-184c82ac6e12");

LotsOfData.Where(d => d.Id == ID).Dump();

//Access Northwind_v2

this.NORTHWIND_V2.LotsOfData.Where(d => d.Id == ID).Dump();
rsaldnfx

rsaldnfx6#

据我所知,多个数据库只在LinqPad的“付费”版本中可用(我所写的适用于LinqPad 6 Premium)。
有关详细信息,请参见this answer in StackOverflow(第节“多数据库支持”)。

相关问题