我经常在不同的数据库中的表的数据进行比较。 这些数据库没有相同的模式。 在TSQL,我可以与引用它们DB>user>table
结构( DB1.dbo.Stores
, DB2.dbo.OtherPlaces
)拉数据进行比较。 我喜欢LINQPad的想法不少,但我似乎无法轻易地从两个不同的数据背景相同的一组语句中提取数据。
我见过的人建议简单地改变连接字符串从其他来源到当前架构提取数据,但是,正如我所说,这是不行的。 难道我就跳过在FAQ页面? 这似乎是一个相当例行程序不可用我。
在“易”的世界里,我喜欢能够简单地引用类型的DataContext是LINQPad创建。 然后,我可以简单地说:
DB1DataContext db1 = new DB1DataContext();
DB2DataContext db2 = new DB2DataContext();
并从那里工作。
更新 :它现在可以做到跨数据库的SQL Server查询在LINQPad(从LINQPad V4.31,与LINQPad高级许可证)。 要使用此功能,按住Ctrl键的同时拖动从架构资源管理数据库的查询窗口。
它也可以查询链接服务器 (你已经通过调用sp_add_linkedserver链接)。 去做这个:
- 添加一个新的LINQ to SQL连接。
- 选择指定新的或现有的数据库 ,并选择您要查询的主数据库。
- 单击包括其他数据库复选框,并选择从列表中的链接服务器(一个或多个)。
请记住,你总是可以创建自己的另一个方面。
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());
}
只要你喜欢不同的SQL实例和执行伪跨数据库连接,数据复制等。注意你可以实例为许多情况下,加入跨情境都在本地执行,所以你必须调用ToList(),ToArray的()等来执行查询使用他们各自的数据源单独地接合前。 换句话说,如果你的“内部”加入从DB1.TABLE1 10行与DB2.TABLE2 20行,两组(各30行)必须在本地计算机上的LINQ执行联接,并返回相关的/交前拉进记忆设置(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;
我不认为你能做到这一点。 见这LinqPad请求。
但是,你可以在一个单独的DLL构建多个DBML文件,并在LinqPad引用它们。
拖动和拖放的方法:按住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();